Pthread_create()错误的启动例程参数传递
Pthread_create() incorrect start routine parameter passing
我的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;
相反。同样的道理也适用于循环打印。
相关文章:
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- c++类声明时,相同的例程,不同的成员变量类型
- C++为线程工作动态地分割例程
- 使用 std::string () const 函数启动线程或未来
- 子例程,不使用 pow,并带有参数和返回
- 直接在RcppArmadillo中调用LAPACK例程
- 在挂钩启动新线程时解除挂钩进程
- 如何将C++子例程链接到 x86 程序集程序?
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- PX 转换例程编译问题
- 成功完成TLS握手后,服务器关闭时出现错误的SSL例程:SSL3_GET_RECORD:错误的版本号
- 只允许授权代码调用库中的例程
- 使用 std::thread & std::bind 在成员函数中启动线程
- GDB 输出启动线程,但给出输出
- SetTimer (带有回调函数)是否通过启动新线程来工作?
- Posix 线程类和启动例程 (pthread)
- 如何使派生类函数作为线程的启动例程?
- Pthread_create()错误的启动例程参数传递
- 传递字符串作为线程启动例程参数:c++
- c++:如何定义类方法作为线程的启动例程(使用pthread库)