从另一个线程中止read()

时间:2012-03-27 07:47:52

标签: linux posix

我的主线程如下:

while (!shouldExit) {
   int c = getchar();
   switch (c) {
     case .... :
     case .... :
     case 'x' : shuoldExit = true; break;
   }
}

然后,有另一个线程从网络读取数据,当我得到一个特殊命令时,它设置shouldExit = 1。这很有效,唯一的问题是根据getchar()的{​​{1}}会阻止strace

我的工作线程如何中止主线程中的read(0)系统调用?

我尝试向自己发送信号,但这只会杀死应用程序(预期)。当我在空处理程序中捕获信号时,应用程序保持活动状态,但read保持阻塞状态。

一种选择可能是使用read,但我对此并不满意。任何替代方案?

修改 另请参阅此问题,这与我的相似,但我们正在寻找不同的解决方案。他的解决方案不适用于我的问题,因为阻塞select()在主线程上。

aborting a blocking read on linux

1 个答案:

答案 0 :(得分:2)

在要发信号的线程上使用pthread_kill()。不要使用kill();就此而言,由于你链接到它,不要使用signal() - 它是一个更加延迟,非便携的接口:

  

signal()的行为在UNIX版本中有所不同,并且也是如此   不同版本的Linux在历史上各不相同。避免它   使用:使用sigaction(2)代替。请参阅下面的便携性。“

[评论中已经回答了这个问题,但由于某种原因,仍然存在未解答问题的相关性问题。所以在这里,为了完整起见]