我的主线是这样的:
while (!shouldExit) {
int c = getchar();
switch (c) {
case .... :
case .... :
case 'x' : shuoldExit = true; break;
}
}
然后,有另一个线程从网络读取数据,当我收到一个特殊命令时,它会设置 shouldExit = 1
。这非常有效,唯一的问题是 strace
中的 getchar()
一直阻塞在 read(0)
上。
我的工作线程如何中止主线程中的 read
系统调用?
我尝试向自己发送信号,但这只会终止应用程序(预期)。当我在空处理程序中捕获信号时,应用程序保持事件状态,但 read
保持阻塞。
一个选择可能是使用 select()
,但我对此并不满意。还有其他选择吗?
编辑:
另见这个问题,它与我的相似,但我们正在寻找不同的解决方案。他的解决方案不适用于我的问题,因为阻塞 read()
在主线程上。
最佳答案
在您要发出信号的线程上使用 pthread_kill()。不要使用 kill();就此而言,既然你链接到了它,就不要使用 signal() ——它是一种更迟钝的、不可移植的接口(interface):
The behavior of signal() varies across UNIX versions, and has also varied historically across different versions of Linux. Avoid its use: use sigaction(2) instead. See Portability below."
[ 这已在评论中得到回答,但出于某种原因仍显示在未回答问题的相关性顶部。所以在这里,为了完整起见]
关于linux - 从另一个线程中止 read(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9885344/