为什么调用pthread_join(tid,& retval)的主函数不等待线程id等于tid的线程关闭?
详细信息 - 我正在尝试使用多线程创建简单的文件复制程序,以便我可以了解有关互斥锁,信号量和死锁的更多信息,但在主线程中不使用sleep(),我的程序终止而不复制数据或不完整的复制。注意我在子线程中调用pthread_exit(retval)。
这是代码 http://ideone.com/mexxmk 这是另一个运行无限计数器的代码,以便检查子线程是否过早地结束,即使调用pthread_join也是如此。 http://ideone.com/0DIxUK ---结果:它没有过早结束。在后一个代码中,主线程确实等待子线程关闭。 那么为什么第一个代码不会以这种方式运行。
答案 0 :(得分:0)
一种方法(假设线程实际完成,以及我尚未了解的其他可能的问题)是使用互斥锁,或类似的东西:
#include <err.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <unistd.h>
pthread_mutex_t Lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t Job_Done = PTHREAD_COND_INITIALIZER;
unsigned long Threads_Completed;
void *worker(void *unused);
int main(void)
{
pthread_t *tids;
struct timespec wait;
if ((tids = calloc(sizeof(pthread_t), 42)) == NULL)
err(EX_OSERR, "could not calloc() threads list");
fprintf(stderr, "dbg starting...\n");
for (unsigned int i = 0; i < 42; i++) {
if (pthread_create(&tids[i], NULL, worker, NULL) != 0)
err(EX_OSERR, "could not pthread_create() thread %u", i);
}
wait.tv_sec = 7;
wait.tv_nsec = 0;
for (;;) {
pthread_mutex_lock(&Lock);
if (Threads_Completed == 42)
break;
pthread_cond_timedwait(&Job_Done, &Lock, &wait);
pthread_mutex_unlock(&Lock);
}
fprintf(stderr, "dbg all done!\n");
exit(EXIT_SUCCESS);
}
void *worker(void *unused)
{
sleep(3 + rand() % 7); // actual work here
fprintf(stderr, "dbg done!\n");
pthread_mutex_lock(&Lock);
Threads_Completed++;
pthread_mutex_unlock(&Lock);
pthread_cond_signal(&Job_Done);
return (void *) 0;
}