是否必须加入非分离的线程?

时间:2016-10-17 07:36:54

标签: pthreads pthread-join

我创建了一个非分离的线程,可以通过2种不同的方法来停止。其中一个(mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent e) { int action = e.getAction(); switch (action) { case MotionEvent.ACTION_POINTER_UP: recyclerView.getParent().requestDisallowInterceptTouchEvent(true); break; } return false; } } )通过连接到生成的线程提供同步接口,而另一个(stop())只是将控制变量stopAsync()设置为false并且不等待提到的线程完成。

m_continue

如果调用void run() { while(m_continue) { // Do something } } void start() { m_continue = true; // Spawn a new thread for run() } void stop() { m_continue = false; // Join to the spawned thread } void stopAsync() { m_continue = false; } stopAsync()方法中的while循环结束但没有人加入该线程。这种情况有资源泄漏吗?是否必须加入非分离的线程?

我无法从文档中找到答案。 ' Notes'部分讲述了我无法理解的事情。

  

线程可以是可连接的也可以是分离的。如果一个线程是可连接的,那么另一个线程可以调用pthread_join(3)来等待线程终止并获取其退出状态。 仅当已终止的可连接线程已加入时,其最后一个资源才会释放回系统。当分离的线程终止时,其资源会自动释放回系统:无法加入与线程,以获得其退出状态。分离线程对某些类型的守护程序线程非常有用,这些守护程序线程的退出状态是应用程序不需要关心的。默认情况下,在可连接状态下创建新线程,除非将attr设置为以分离状态创建线程(使用pthread_attr_setdetachstate(3))。

https://linux.die.net/man/3/pthread_create

1 个答案:

答案 0 :(得分:0)

  

仅当已终止的可连接线程已加入时,其最后一个资源才会释放回系统。

这部分文档的含义是,如果你没有加入,那么线程的某些资源将在退出后保持分配状态。这样做类似于在没有malloc()的情况下调用free() - 它不是"强制性的"从某种意义上说,如果你没有,它不会导致你的程序立即出现问题,但 代表资源泄漏,所以如果你长期重复这样做程序你可以耗尽相关的资源。

在设置标志变量之前,stopAsync()只需在另一个线程上调用pthread_detach()代替加入线程。

请注意,您的m_continue变量应受同步原语(如互斥锁或读写器锁)的保护。