2009-11-24 126 views
2

我收到错误“未定义的引用到'pthread_attr_init'”,即使它应该在pthread.h中。这是在应该为Pthreads设置的UNIX环境中。此外,是一个void *指向当前矩阵的好方法吗?这是我的代码,有什么想法?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

你使用了哪些编译器标志? – Suppressingfire 2009-11-24 05:03:25

回答

5

这将取决于你的平台上,但我会尝试添加-lpthread你的链接命令,那就是在Linux和其他一些必需的。您的程序在此编译为g++ foo.cc -lpthread

+2

对于pthreads(特别是),不是编译器开关-pthread,还是最近发生了变化? – Suppressingfire 2009-11-24 05:29:35

+0

这可以在一些编译器/平台上工作......例如,Sun的cc用于像这样工作。我认为gcc支持它也与其他人兼容。 – asveikau 2009-11-24 05:45:21