C++ 线程阻塞等待消息

C++ 线程阻塞等待消息,c++,c,linux,sockets,pthreads,C++,C,Linux,Sockets,Pthreads,我有一个pthread正在运行并等待来自套接字的消息。线程被阻塞以等待消息,直到收到新消息后才会唤醒。是否有方法向线程发送信号以唤醒,并让接收函数(recvmsg)返回与信号相关的错误代码?是,默认情况下,SIGINT将中断所有系统调用。从man recv: EINTR The receive was interrupted by delivery of a signal before any data were available; see signal(7)

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

是,默认情况下,SIGINT将中断所有系统调用。从
man recv

    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上有一个众所周知的技巧,它允许接收线程使用
select
poll
同时侦听套接字条件[1]

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



[1] 通常情况下,
pthread\u cond\u wait
poll
/
select
不能在没有赛车的情况下组合在一起,因此您需要用小的超时来编程等待循环。相比之下,在Win32上,它与
WaitForMultipleObjects
一样简单,而且您已经完成了pthread\u kill允许您向线程发送信号,但我更喜欢管道解决方案,这是一个很好的提示。不知道pthread_kill;手册页说整个过程都会受到影响,YMMV(用手册页摘录更新答案)我应该注意到pthread_kill对于SIGINT应该会影响目标线程。STOP/CONTINUE/TERM会影响所有线程(在linux/Unix中),这并不奇怪。如果要使用阻塞IO,那么取消它们的唯一选项是通过信号。如果您使用的是非阻塞IO,那么您应该了解为什么需要线程,以及如何使用它们。线程的数量应保持接近CPU的数量,每个连接的线程模型不可缩放。