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



我的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个线程:1个

tid:2932403008个线程:1个

在更一般的情况下,当numberOfThreads=n时,对于所有线程,no.thread等于n-1。你能帮我弄清楚为什么吗?在你如何使用启动程序的过程中,有什么我不理解的地方吗?

谢谢你抽出时间。

由于您将相同位置的地址(arg[0])传递给此处的所有线程,因此代码中存在数据竞赛

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

您可能打算使用:

   arg[i]=i;

相反。同样的道理也适用于循环打印。

最新更新