原谅我,我刚刚开始了多线程的概念,我只是想知道为什么我的线程可能会在他们加入之前退出。基本上,我正在维护一个全局的进程ID列表,我通过调用
迭代地创建它们 if(pthread_create(&thread_id[i], NULL, function_to_execute, NULL)) {
fprintf(stderr, "error thread not created\n");
}
现在的问题是,我的所有线程在进入我的pthread join之前都已退出
pthread_join(thread_id[i], NULL);
深深嵌套在函数调用中,函数调用在创建线程后直接调用。我不确定我是否想要做某些锁定或其他事情,或者添加一个额外的命令以确保线程在退出前等到join语句。
答案 0 :(得分:2)
来自POSIX文档:
pthread_join()函数应暂停执行调用 线程直到目标线程终止,除非是目标线程 已经终止了。从成功的pthread_join()返回 使用非NULL value_ptr参数调用,传递给的值 终止线程的pthread_exit()应该可用 value_ptr引用的位置。当pthread_join()返回时 成功,目标线程已终止。结果 多个同时调用pthread_join()指定相同的 目标线程未定义。如果调用pthread_join()的线程是 取消,然后目标线程不得分离。
所以,不。只要您满足上述要求,您就不需要采取任何额外措施。
答案 1 :(得分:0)
我不完全确定为什么如果线程在pthread_join()声明退出状态之前完成会出现问题?
这是完全正常的。
pthread_create()在指定的函数处启动新的执行线程。该功能立即运行,甚至可以抢占启动器线程。线程有自己的局部变量(堆栈)和线程局部变量。必须协调所有其他共享内存访问或发生数据竞争。通常,共享数据受互斥锁保护。线程将继续运行(通常与其他线程并行),直到它被某些同步操作阻塞或线程退出其启动函数。
线程可以使用pthread_join()等待其他线程成功完成执行。与usr一样,如果线程已经完成,pthread_join()不会等待。