Pthread_create()错误的启动例程参数传递

时间:2016-05-05 14:10:05

标签: c++ multithreading pthreads

我的C ++应用程序中的pthreads有问题。

在我的主要功能中,我有:

int main(){
    ...

    for(i=0; i<numberOfThreads; i++){
        arg[0]=i;
        pthread_create(&tidVec[i], NULL, &thread_body, (void*) arg);
        cout << "tidVec[" << i <<"]: " << tidVec[i] << " arg[0]: " << arg[0] << endl;
    }

    ...
}

在我的thread_body函数中:

void * thread_body(void* arg){
    ...
    int* a = (int*)arg;
    cout << "tid: " << pthread_self() << " no.thread: " << a[0] << endl;

    ...
}

此输出(例如numberOfThreads = 2)似乎是:

  

tidVec [0]:2932403008 arg [0]:0

     

tidVec [1]:2924010304 arg [0]:1

     

tid:2924010304 no.thread:1

     

tid:2932403008 no.thread:1

在更一般的情况下,对于所有线程,numberOfThreads = n,no.thread等于n-1。 你能帮我解决一下原因吗?在使用启动例程时,我是否有一些不明白的事情?

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

您的代码中有一个data race,因为您将同一位置的地址(ng-class)传递给此处的所有主题:

arg[0]

您可能打算使用:

    arg[0]=i;
    pthread_create(&tidVec[i], NULL, &thread_body, (void*) arg);

代替。这同样适用于您在循环中执行的打印。