gpt4 book ai didi

linux - 从另一个线程中止 read()

转载 作者:太空宇宙 更新时间:2023-11-04 09:52:02 26 4
gpt4 key购买 nike

我的主线是这样的:

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

然后,有另一个线程从网络读取数据,当我收到一个特殊命令时,它会设置 shouldExit = 1。这非常有效,唯一的问题是 strace 中的 getchar() 一直阻塞在 read(0) 上。

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

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

一个选择可能是使用 select() ,但我对此并不满意。还有其他选择吗?

编辑:另见这个问题,它与我的相似,但我们正在寻找不同的解决方案。他的解决方案不适用于我的问题,因为阻塞 read() 在主线程上。

aborting a blocking read on linux

最佳答案

在您要发出信号的线程上使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com