Ton*_*ony 6 c multithreading pthreads
我正在使用 for 循环来创建多个线程并将索引 i 作为参数传递,如下所示:
pthread_t p[count];
for (int i = 0; i < count; i++){
pthread_create(&p[i], NULL, &somefunc, (void*)&i);
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试检索 i 的值:
void *somefunc (void* ptr){
int id = *(int*)ptr;
}
Run Code Online (Sandbox Code Playgroud)
但是,我注意到有时,线程中的 id 会有重叠的值,我怀疑这是由于在线程能够检索值之前 for 循环更新的索引(因为我传入了指针,而不是值本身)。有没有人有任何建议可以在不减慢 for 循环的情况下克服这个问题?
谢谢
发生这种情况是因为一旦您将指针传递给i您,现在就有多个线程使用相同的值。这会导致数据竞争,因为第一个线程正在修改i,而第二个线程希望它永远不会改变。您始终可以分配一个临时 int 并将其传递给线程函数。
pthread_create(&p[i], NULL, &somefunc, new int(i));
Run Code Online (Sandbox Code Playgroud)
这将在动态存储(堆)中分配一个整数并使用 的值对其进行初始化i。然后,指向新分配的整数的指针将被传递给线程函数。
然后在线程函数中,您可以像以前一样获取传递的值,然后删除 int 对象。
void *somefunc (void* ptr){
int id = *(int*)ptr;
delete (int*)ptr;
}
Run Code Online (Sandbox Code Playgroud)
[建议:避免 C 风格的强制转换。]
| 归档时间: |
|
| 查看次数: |
5244 次 |
| 最近记录: |