我在开源软件中发现了一段奇怪的代码
for (i=0; i<store->scan_threads; i++) {
pthread_join(thread_ids[i], NULL);
pthread_detach(thread_ids[i]);
}
调用pthread_detach有什么意义吗?
答案 0 :(得分:2)
那节很愚蠢,不安全。
设计方面,detach
是不必要的 - join
完成已经意味着线程已完全完成。什么都没有分离。 (有问题的代码只是生成具有默认连接性的线程。)
实施方面,detach
不安全。一旦线程完成,线程ID就可以被回收 - 哎呀,并不意味着分离那个其他线程!更糟糕的是,在调用join
之后,ID无法保证有意义 - SEGV?
答案 1 :(得分:1)
在此代码中(考虑到此代码来自主线程....)
pthread_join(thread_ids[i], NULL);
这将等待主线程返回线程ID为“thread_ids [i]”的线程,如果主线程正在做更多的工作,那么
pthread_detach(thread_ids[i]);
将释放线程使用的资源(线程ID为“thread_ids [i]”。