首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程阻塞等待消息

线程阻塞等待消息
EN

Stack Overflow用户
提问于 2011-04-25 17:50:30
回答 1查看 533关注 0票数 2

我有一个正在运行的线程,正在等待来自套接字的消息。线程被阻塞以等待消息,直到收到新消息才会醒来。是否有一种方法将信号发送到线程以唤醒并使接收函数(recvmsg)返回与信号相关的错误代码?

EN

回答 1

Stack Overflow用户

发布于 2011-04-25 18:43:07

是的,默认情况下,SIGINT将中断所有系统。来自man recv

代码语言:javascript
复制
    EINTR  The receive was interrupted by delivery of a signal before any 
           data were available; see signal(7). 
and 
    MSG_WAITALL (since Linux 2.2)
          This flag requests that the operation block until the full request is 
          satisfied.  However, the call may still return less data than requested
          if a signal is caught, an error or disconnect occurs, or the next 
          data to be received is of a different type than that returned.

但是,您不能针对特定的线程或特定的操作。

如果您希望这样做,我建议使用接收线程可以解释侦听的条件。在linux上有一个众所周知的技巧,它允许接收线程使用selectpoll侦听套接字,并使用“条件”simultaneously1进行

诀窍是打开从主线程到客户端(接收)线程的管道。当达到某种状态时,主人会写到管道上(可以说是信号)。客户端(接收)线程可以简单地轮询管道和套接字,只检查这两个线程中哪个唤醒了它。

1通常情况下,在没有赛车的情况下,poll/selectpthread_cond_wait不能结合在一起,所以您需要编写带有小超时的等待循环。相比之下,在Win32上,它就像WaitForMultipleObjects一样简单,您就完成了

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5781293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档