2011-06-15 152 views
6
 pthread_create(&thread, NULL, AcceptLoop, (void *)this); 

我已经声明这样和AcceptLoop函数内部我有无限的while循环。当服务器关闭时,我想关闭此线程。我已阅读pthread_cancel和pthread_join,但我不确定哪一个更好,更安全。我想听听一些详细的说明或教程。提前致谢。如何安全地关闭线程?

回答

1

我相信你想从主线程的信号,退出工作线程。

Inside AcceptLoop而不是循环无限循环条件,你可以通过你的主线程设置条件,你将不得不使用一些同步这个变量。一旦从主线程设置变量,工作线程AcceptLoop就会爆发,然后可以调用pthread_exit

如果你想让你的主线程等待子线程退出,你可以使用pthread_join来这样做。

一般情况下,一个子线程可以在三个条件下退出:

  1. 调用pthread_exit
  2. 致电pthread_cancel
  3. 线程函数返回。
2

你不需要做任何事情,只是从线程函数返回将干净地结束线程。您也可以拨打pthread_exit(),但我宁愿回来。 pthread_cancel()是可怕和复杂/很难得到正确的。如果可能,保持清醒。 pthread_join()如果您想知道线程何时完成并且对return值感兴趣,则最主要需要。

哎呀,我错了。已经有一段时间了。为了我所说的是真实的,你必须脱离你的线索。否则,你就需要调用pthread_join函数:

无论是在pthread_join(3)或 pthread_detach()应该呼吁 每个线程 该应用程序创建,使该线程 系统资源可以 发布。 (但是请注意,所有线程的资源被释放 当 进程终止。)

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_detach.3.html

+2

这一切都取决于线程是否被分离。如果没有,那么你将需要pthread_join线程来清理线程的内存。如果你已经分离了,那么是从主函数或pthread_exit()返回。 – Suroot 2011-06-15 03:55:49

+0

@Suroot你是100%正确的,我编辑了我的答案来反映。 – 2011-06-15 03:59:11