2009-11-24 5 views
2

Je reçois erreur "référence non définie à` pthread_attr_init '", même si cela devrait être dans pthread.h. C'est dans un environnement UNIX qui devrait être configuré pour Pthreads. En outre, un vide * est-il un bon moyen de pointer vers la matrice actuelle? Voici mon code, des idées?Erreur de compilation Pthreads C++

#include <cstdlib> 
#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 
#include <time.h> 
#include <limits.h> 
#include <pthread.h> 
#include <semaphore.h> 

#define MAX_MATRIX_SIZE  256 
#define MAX_THREADS   64 

using namespace std; 

void *StripProcessor(void *); 
void Barrier(); 
void InitMatrix(int rows, int cols); 

int main(int argc, char *argv[]) 
{ 
    /* Get command line params */ 
    if (argc != 3) { 
     cout << "Error: need 2 command line params." << endl; 
     getchar(); 
     return 1; 
    } 
    int numThreads = atoi(argv[1]); 
    double epsilon = atof(argv[2]); 


    /* Locals hang here */ 
    pthread_mutex_t barrier; 
    pthread_cond_t leave; 
    int numWaiting = 0; 

    int rows; 
    int cols; 
    int stripSize; 
    int lastStripSize; 
    int iterations; 

    double matrix1[MAX_MATRIX_SIZE][MAX_MATRIX_SIZE]; 
    double matrix2[MAX_MATRIX_SIZE][MAX_MATRIX_SIZE]; 
    void *currentMatrix = matrix1; //???????????????? 
    double stripMaxDiff[MAX_THREADS]; 

    clock_t start; 
    clock_t finish; 


    /* Get rows and cols from standard in */ 
    string buffer; 
    getline(cin, buffer); 
    istringstream myStream(buffer); 
    myStream >> rows; 
    myStream >> cols; 
    cout << rows << " " << cols << endl; 
    getchar(); 


    /* Set locals */ 
    if (rows % numThreads == 0) { 
     stripSize = rows/numThreads; 
     lastStripSize = 0; 
    } 
    else { 
     stripSize = rows/numThreads + 1; 
     if (rows % stripSize == 0) { 
      numThreads = rows/stripSize; 
      lastStripSize = 0; 
     } 
     else { 
      numThreads = rows/stripSize + 1; 
      lastStripSize = rows - (stripSize * (numThreads - 1)); 
     } 
    } 


    /* Set up threads */ 
    vector<pthread_t> threadID; 
    pthread_attr_t attr; 
    pthread_attr_init(&attr); 
    pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); 


    /* Init mutex, CV, and matrix */ 
    pthread_mutex_init(&barrier, NULL); 
    pthread_cond_init(&leave, NULL); 
    //InitMatrix(rows, cols); 


    /* Create threads and wait for completion */ 
    start = clock(); 

    /*for (unsigned int i = 0; i < threadID.size; i++) 
     pthread_create(&threadID[i], &attr, StripProcessor, (void *) i); 
    for (unsigned int i = 0; i < threadID.size; i++) 
     pthread_join(threadID[i], NULL);*/ 

    finish = clock(); 


    /* Print results */ 

} 
+0

Quels drapeaux de compilateur utilisez-vous? – Suppressingfire

Répondre

5

Cela dépendra de votre plate-forme, mais je -lpthread essayer d'ajouter à votre commande lien que c'est ce qui est nécessaire dans Linux et quelques autres. Votre programme compile bien ici comme g++ foo.cc -lpthread.

+2

Pour les pthreads (spécifiquement), n'est-ce pas le commutateur du compilateur -pthread, ou cela a-t-il changé récemment? – Suppressingfire

+0

Cela fonctionne sur certains compilateurs/plateformes ... par exemple, le cc de Sun fonctionnait comme ça. Je pense que gcc le supporte aussi pour être compatible avec les autres. – asveikau