【发布时间】:2016-12-30 11:22:55
【问题描述】:
请原谅我刚刚开始了解多线程的概念,我只是想知道为什么我的线程可能在它们加入之前就退出了。本质上,我正在维护一个进程 ID 的全局列表,我通过调用
迭代地创建它们 if(pthread_create(&thread_id[i], NULL, function_to_execute, NULL)) {
fprintf(stderr, "error thread not created\n");
}
现在的问题是,我的所有线程在进入我的 pthread 连接之前都已退出
pthread_join(thread_id[i], NULL);
深深嵌套在函数调用中,在线程创建后直接调用。我不确定我是否应该做一些锁定或其他事情,或者添加一个额外的命令来确保线程等到 join 语句才退出。
【问题讨论】:
-
这取决于
function_to_execute。也许它会引发异常?你怎么知道他们在到达join之前就退出了?也许他们处于无限循环或其他什么 -
如果你
pthread_join()ing 的线程已经终止,没有问题。在这种情况下,pthread_join()将立即返回,否则必须等待。 但是:您不得尝试使用已被pthread_join()ed 或pthread_detach()ed 的线程pthread_join()。 -
感谢您提供所有这些信息。 @AhmadWabbi 我认为您对我的问题可能是对的,我已经运行了一些测试并将函数限制为仅打印“已执行”,并在 for 循环之前创建线程,并在每次迭代后加入 thread_id[i]。输出如下: 执行 执行 执行 循环.. 循环.. 循环.. 循环.. 执行
-
@noobatrilla,是的,你的描述不正确。新线程一被创建就开始运行(或至少有资格运行)。
pthread_join()的目的是等到指定线程结束,之后进行清理。
标签: c multithreading thread-safety pthreads thread-synchronization