2016-10-17 40 views
0

我创建了一个非分离的线程,可以通过两种不同的方法停止。其中之一(stop())提供通过加入到生成的螺纹,而另一(stopAsync())只是将控制变量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()情况下被调用,在run()方法完成的,而循环,但没有一个人加入到该线程。这种情况是否有资源泄漏?加入非分离线程是否强制?

我无法从文档中弄清楚。 “注释”部分讲述了我无法理解的内容。

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

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

回答

0

只有当终止合并线程已经加入是最后的资源释放回系统。

这部分文档的含义是,线程的一些资源在退出之后将保持分配状态,如果不加入的话。这样做,这是类似于调用malloc()没有free() - 这不是“强制”在这个意义上,如果你不这样做也不会立即导致问题的程序,但它确实代表资源泄漏,所以如果你做这反复在一个长期运行的程序中可以耗尽相关资源。

代替加入线程,在设置标志变量之前,您的stopAsync()可以在其他线程上调用pthread_detach()

请注意,您m_continue变量应该由原始的像一个互斥体或读写锁同步进行保护。

+0

感谢您的提醒,'m_continue'是一个原子布尔值。 –