相同的线程 ID
Same thread ID's
我写了一段代码来进行一些多线程处理,以测试dd的写/读速度。
一切都在编译和运行,但我注意到线程ID是一样的。
因此,我创建了一个条件(参见代码注释),它令人惊讶地显示,我创建的每个线程都有相同的ID。
int main(int argc, char *argv[]) {
//long filesize = 10000000;
int nb_threads = atoi(argv[2]);
pthread_t tid[4];
int ok;
double latency;
double bandwith;
int err;
int i = 0;
srand(time(NULL));
while(i < nb_threads){
pthread_create(&(tid[i]),NULL,launch_dd_bm,(void *) argv);
pthread_join(tid[i], NULL);
/* if(!pthread_equal(tid[i],tid[i-1])){
printf("Thread ID: %u",tid[i]);
i++;
}
*/
i++;
}
return EXIT_SUCCESS;
}
void *launch_dd_bm(void *arg);
我知道我不是在测试线程是否成功创建,但它们确实成功了。我刚刚删除了上面代码中的条件,这样你就可以真正看到发生了什么。
创建线程后立即调用pthread_join(),因此会发生
主线程的执行将暂停并等待创建的线程完成其
处决当第一个线程完成时,它的Id不再使用,因此是相同的Id
"可以被随后创建的线程获取"。这就是为什么所有
您的线程具有相同的Id。
为了避免这个问题,您应该在while循环之外调用pthread_join()。
pthread_create
存储"已创建线程的id"。因此,线程ID只保证在当前运行的线程中是唯一的,而不是在进程中创建的所有线程中。一旦线程退出,就可以安全地重用其ID。这类似于malloc
在不释放新指针的情况下返回新指针的方式,此时释放的指针可能会被重用。
如果您需要一个真正永久的ID,那么很容易实现共享计数器,例如通过从launch_dd_bm
中增加全局变量(并记住用互斥锁保护它)。
相关文章:
- 我应该在C++中打印线程 ID 吗?
- 我可以使用Qt线程ID为每个线程创建唯一的缓存吗?
- 这种基于线程 ID 的同步是否安全整洁?
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- C 不同的线程在FreeBSD 10上具有相同的线程ID
- 如何获取正确的线程 ID 和值
- 调试器看到的输出线程 ID
- 如何从父线程中提取 pthread 的任务 id(tid)
- 是否可以向特定的线程 ID 发送信号?
- 与上一个线程具有相同ID的线程同步
- C++ 中 OpenMP 中的有序线程 ID
- 如何通过id获取线程对象?
- 您可以在 OpenMP 中将特定线程 ID 分组到唯一的任务组中吗?
- 查找称为函数C 的线程ID
- 确定进程的输入线程 ID
- C++ 中"main"线程的 ID
- SetWindowShookex(WH_KEYBOARD)无法与线程ID一起使用
- 在性能方面获取线程 ID 是否昂贵
- 标准::线程::id的要求.可以雾化吗?
- 如何知道谁是给定线程 ID 的父线程