为什么pthread_exit的行为类似于pthread_join
Why pthread_exit acts like pthread_join?
代码:
void *PrintHello(void *threadid)
{
cout<<"Hello"<<endl;
sleep(3);
cout<<"Still PrintHello is alive"<<endl;
}
int main (int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
cout<<"Calling thread:"<<t<<endl;
pthread_create(&threads[0], NULL, PrintHello, NULL);
//pthread_join(threads[0],NULL);
cout<<"Main exits"<<endl;
pthread_exit(NULL);
}
为什么这里的pthread_exit(NULL)
和pthread_join()
一样?即为什么退出main
而不破坏printHello
线程并允许其继续?
pthread_exit()
仅终止调用线程。因此,当您从main()
调用它时,它会终止主线程,同时允许进程继续。这是意料之中的事。
如果您改为调用exit()
(或通过返回从中隐式退出),它将终止整个过程,并且您将看到printHello
也被终止。
这里有一个很好的资源,但要引用解释您问题的部分:
关于从main()调用pthread_exit()的讨论:
如果不显式调用pthread_exit(),那么如果main()在它派生的线程之前完成,就会出现明显的问题。它创建的所有线程都将终止,因为main()已完成,不再存在以支持线程。
通过将main()作为最后一件事显式调用pthread_exit(),main()将阻塞并保持活动状态,以支持它创建的线程,直到它们完成为止。
相关文章:
- 类似于strcat()的函数出现问题
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 算术运算的结果类似于:C浮点变量中的1/3
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 创建类似于布尔值的变量类型
- 如何在 Arduino 字符串的开头添加元素.类似于 JS unshift();
- Java 中是否有类似于 C++ 中引用类型"&"的内容?
- C++未知长度字符串的数组,其行为类似于 Python 字符串列表
- 如何创建类似于 QVariant 的变体类
- 对于多个字符(如 ETX/STX 对),是否有类似于 std::quote 的东西
- 初始化命名空间中的变量是否类似于将它们初始化为类成员?
- C++中用于结构的纯数组的类似于TableView/DataFrame的通用功能
- 有没有类似于stoi的函数可以用于模板类
- 如何编写一个类似于kernellist_head的c++风格的双链表实现
- 序列化模式类似于boost::序列化
- 构造一个类似于JSON文件c++的字符串
- 多重继承中的派生类的行为类似于聚合
- 如何使更安全的C++变体访问者,类似于切换语句?
- C++ Python 中是否有类似于 help() 的函数
- 是c++中pthread库中的互斥锁,类似于Java中的synchronized关键字