杀死具有套接字的单独线程

时间:2010-04-13 14:18:41

标签: c++ networking multithreading boost-thread

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

由于需求,一旦启动单独的线程,我需要避免主线程上的任何阻塞功能。 一旦调用了我的类的析构函数,我就无法在侦听器线程上执行连接,所以我唯一能做的就是杀死它。

我的问题是:

  1. 传递给thead的函数分配的网络资源会发生什么变化?插座是否正确关闭或可能有待处理的事情? (最担心的是)

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

  3. 我正在使用Linux ...我可以检查什么命令或者我可以检查什么以确保没有待处理的网络资源或操作系统出现问题

  4. 非常感谢你的帮助

    此致 MNSTN

    注意:我在C ++中使用boost :: thread

2 个答案:

答案 0 :(得分:2)

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

  2. boost::thread没有 kill方法。你只能 打断它。效果不是 立即,取决于操作系统 调度器。

  3. 用于查看网络资源 一个进程保持签出 lsof netstat(8) 使用-p选项。

  4. 您描述的阻塞套接字的停止信令问题通常通过self-pipe trick解决。

答案 1 :(得分:2)

当你杀死一个线程时,你无法确定它拥有什么资源。例如,它可能是持有堆互斥;如果你杀死线程,互斥锁将保持锁定状态,并且没有人(在你的过程中)将能够分配动态内存。

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