0

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

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

我的问题是:

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

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

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

我非常感谢你的帮助

问候 MNSTN

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

4

2 回答 2

2
  1. 网络资源属于进程,而不是线程,所以套接字仍然是打开的。

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

  3. 要查看进程拥有哪些网络资源,请查看lsofnetstat(8)-p选项。

您所描述的阻塞套接字的停止信号问题通常可以通过self-pipe 技巧解决。

于 2010-04-13T14:34:40.843 回答
2

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

以和平的共识来做这些事情比通过武力来做这些事情要好得多。只需添加一种方法来向您的线程发出不再需要它的信号。它可以是一个boost::condition. 线程将检查此条件并在收到信号时停止。

于 2010-04-13T14:40:51.597 回答