我编写了一个代码来进行多线程处理,以便对我的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);
我知道我没有测试线程是否成功创建,但它们是。 我刚刚删除了上面代码中的条件,因此您可以真正看到发生了什么。
答案 0 :(得分:2)
pthread_create
存储已创建线程的&#34; id&#34;。因此,线程ID仅保证在当前运行的线程中是唯一的,而不是在进程中创建的所有线程中唯一。一旦线程退出,其ID就可以安全地重复使用。这类似于malloc
返回新指针的方式,只要您不释放它们,此时您可以重复使用它们。
如果您需要一个真正永久的ID,很容易实现共享计数器,例如通过从launch_dd_bm
递增一个全局变量(并记住用互斥锁保护它)。
答案 1 :(得分:2)
你在创建线程后立即调用pthread_join(),所以会发生什么
主线程的执行停止并等待创建的线程完成其中
执行。当第一个线程完成时,其Id不再使用,因此ID相同
&#34;可以获得&#34;通过之后创建的线程。这就是为什么所有的原因
你的主题有相同的身份。
要避免此问题,您应该在while循环外调用pthread_join()。