请原谅我刚刚开始了解多线程的概念,我只是想知道为什么我的线程可能在加入之前就退出了。本质上,我维护一个进程 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 语句。
来自 POSIX 文档:
pthread_join() 函数应暂停调用的执行 线程直到目标线程终止,除非目标线程 已经终止了。从成功的 pthread_join() 返回时 使用非 NULL value_ptr 参数调用,该值传递给 终止线程的 pthread_exit() 应在以下位置可用 value_ptr 引用的位置。当 pthread_join() 返回时 成功,目标线程已终止。结果 多次同时调用 pthread_join() 并指定相同的内容 目标线程未定义。如果调用 pthread_join() 的线程是 取消,则目标线程不应被分离。
所以,不。只要满足上述要求即可,无需采取任何额外措施。
我不完全确定如果线程在
pthread_join()
声明其退出状态之前完成,为什么会出现问题?
这是完全正常的。
pthread_create()
在指定函数处启动新的执行线程。该函数立即运行,甚至可能抢占启动线程。线程有自己的局部变量(堆栈)和线程局部变量。所有其他共享内存访问都必须协调,否则就会发生数据争用。通常共享数据受到互斥体的保护。线程将继续运行(通常与其他线程并行),直到它被某些同步操作阻塞或线程退出其启动函数。
线程可以使用
pthread_join()
等待其他线程成功完成执行。就像 usr 指出的那样,如果线程已经完成,pthread_join() 将不会等待。