2010-04-13 25 views
0

我有一个单独的线程ListenerThread,它有一个套接字监听由某个远程服务器广播的信息。这是在我需要开发的一个类的构造函数中创建的。查杀具有套接字的单独线程

由于要求,一旦单独的线程启动,我需要避免主线程上的任何阻塞函数。 一旦涉及到调用我的类的析构函数的时候,我不能在侦听器线程上执行联接,因此我唯一能做的就是杀死它。

我的问题是:

  1. 会发生什么由传递给THEAD功能分配网络resoruces?套接字是否正确关闭,或者可能有未决事项? (最担心这个)

  2. 这个过程是否足够快,即线程是否被杀死,以便立即中断?

  3. 我使用Linux ...我可以检查什么命令或者什么,以确保没有网络资源的未决或出现了错误的操作系统

我非常感谢你太多的帮助

问候 MNSTN

注意:我使用boost ::线程C++

回答

2
  1. 网络资源属于进程,而不是线程,因此套接字仍处于打开状态。

  2. boost::thread没有 kill方法。你只能 中断它。效果不是立即执行且取决于OS 调度程序。

  3. 对于希望在什么样的网络资源 一个进程持有退房lsofnetstat(8)-p选项。

的停止信号问题与你描述通常与self-pipe trick解决阻塞插座。

+0

谢谢尼古拉! 你能确认,即使我使用PTHREAD,我也有使用pthread_cancel或pthread_kill或其他函数的问题吗?由于操作系统中的网络资源,相同的自我管理技巧必须适用,对吧? – user311906 2010-04-13 16:05:07

+0

我不会说* must *,但它的工作原理是相同的('boost :: thread'是在Unix上用PThreads实现的。) – 2010-04-13 16:26:41

2

当你杀死一个线程时,你不能确定它拥有哪些资源。例如,它可能持有堆互斥锁;如果杀死线程,互斥锁将保持锁定状态,并且任何人(在您的进程中)都将无法分配动态内存。

通过和平共识而不是武力来做这些事情要好得多。 只需添加一种方式,告诉您的线程它不再需要它。它可以是一个boost::condition。线程会检查这种情况,并在发出信号时停止。

+0

HI ATZZ。感谢您的答复。在我的代码中,实际上我没有任何互斥体。你认为使用boost :: condition比使用boost :: thread :: interrupt()杀死线程更好吗? – user311906 2010-04-13 15:55:58

+0

我不确定boost :: thread是否有类似的东西,但是pthreads API特别支持pthread_atexit()作为线程释放其在线程终止时管理的资源的一种方式。把pthread_atexit()想象成类似于线程的“最后的遗嘱”。 – 2010-04-13 16:44:21

+0

@克里斯克利兰 - 你的意思是pthread_cleanup_push()?它可以帮助您明确控制的资源,但对于您隐式使用的资源(在您使用的库的实现中)或系统资源有什么帮助? – atzz 2010-04-14 07:29:10