你需要加入取消的线程吗?(pthreads)
Do you need to join a cancelled thread? (pthreads)
当您在取消方面使用PThreads时,我对清理顺序有点困惑。通常,如果线程被分离,它会在终止时自动清理。如果它没有分离,则需要加入它以回收系统资源。
我正在阅读的教科书中指出,以下内容听起来很奇怪,加入对于取消来说是可选的:
"如果你需要知道线程何时实际终止,你必须取消后通过调用pthread_join来加入它。"
那么,我需要加入一个被取消的线程来释放它的资源吗?如果不需要,为什么?
TLPI这样说:
在接收到取消请求时,可取消性为enabled和deferred在下一次到达取消时终止指向如果线程没有分离,则进程必须与其连接,以防止它成为僵尸线程。
此外,由于取消线程通常不会在没有加入的情况下立即完成(阅读更多关于"取消点"的信息),您无法确定该线程是否真的被取消了。
来自man pthread_join
:
在被取消的线程终止后,使用pthread_join(3)获得PTHRAD_CANCELED作为线程的退出状态。(使用线程连接是知道取消具有已完成。)
似乎加入对于执行来说是不必要的——如果你想知道你实际成功了什么,那么加入是必要的。
来自pthread_cancel()
:的文档
在被取消的线程终止后,使用pthread_join(3)与该线程的联接将获得pthread_CCANCELED作为线程的退出状态。(使用线程连接是知道取消已完成的唯一方法。)
使用pthread的线程可以具有以下取消状态:
PTHREAD_CANCEL_ENABLEPTHREAD_CANCEL_DISABLE
如果你试图取消一个线程,你不会100%知道这个线程是否真的会被取消。如果线程真的被取消或没有被取消,使用联接会向您传递信息。还有需要考虑的取消类型以及用于设置取消类型和状态的相应pthread功能:
int pthread_setcancelstate(int state,int*oldstate);int pthread_setcanceltype(int类型,int*oldtype);
以下是从中借来的示例代码http://www.ijon.de/comp/tutorials/threads/cancel.html
编辑:要么我太笨了,没法发布几行代码,要么格式化程序今天真的让我很紧张。请在上面的链接中查找代码。
如果某个线程出现问题,或者以某种方式被in阻止,操作系统总是会对其进行清理。所以一切都很好,很安全。
只有当您必须确保线程实际上已经停止执行时,才需要加入线程,比如合并两个并行任务。(例如,如果你有不同的线程在不同的部分上工作,那么当你想再次组合结构时,你需要将它们全部连接起来,就像等待它们全部完成一样)
- 如何使用 pthreads 以正确的方式设置两个线程之一的优先级
- C++,pthreads:如何从多个线程停止工作线程
- 如何在 pthreads 中正确同步线程
- pthreads 多线程矩阵乘法
- 如何使用pthreads在Solaris上增加C 线程堆栈的大小
- 使用pthreads实现线程池
- 使用pthreads时的后台线程(不错,优先级)
- 如何使用pthreads使多线程正常工作,而不是使用C++在类中提升
- 提高线程池(C++,pthreads)的性能
- pthreads:快速重新锁定导致的线程不足
- 如何在Mac操作系统上设置线程优先级pthreads
- pthreads如何创建许多线程
- 在g++中是使用pthreads作为后台的C++11线程模型
- 在 C++ 中使用 pthreads 实现线程池
- 使用pthreads(在C++中)将数据传递给线程
- Win32/pthreads线程函数上的volatile正确性
- 读取线程应用程序(linux,pthreads)中的文件大小时出错
- 你需要加入取消的线程吗?(pthreads)
- 如何使用pthreads以智能的方式向线程共享变量
- 终止一个被阻塞的pthreads线程