如果发送进程暂停,boost :: interprocess :: timed_receive()永远不会返回

时间:2014-02-15 02:01:36

标签: c++ winapi boost boost-interprocess

我认为在这种情况下调用timed_receive()只会超时,但是它会在尝试锁定互斥锁时卡住。

那么在尝试接收数据之前,我是否可以在我的阙上调用一个函数,该函数告诉我发送过程是否已经死亡或停止?

1 个答案:

答案 0 :(得分:0)

没有通用的方法可以知道对方,死亡,停止,部分锁定(例如其中一个线程处于无限循环中),玩负鼠,还是仅仅是对抗性。如果对方是合作的,您可以与心跳进行通信,并依靠它们来决定它是否具有响应性。

您的程序“卡住”试图锁定互斥锁这一事实(您确定是这种情况吗?)可以表明,

  • 队列为空,超时值未过期
  • 你遇到了僵局。

timed_receive成功,超时或按预期抛出:

bool timed_receive(void * buffer, std::size_t buffer_size, 
                   std::size_t & recvd_size, unsigned int & priority, 
                   const boost::posix_time::ptime & abs_time);
  

从消息队列中接收消息。消息存储在   缓冲区“缓冲区”,其大小为“buffer_size”。收到的消息   具有“recvd_size”大小和优先级“priority”。如果消息队列是   清空接收器重试直到达到“abs_time”时间。返回   如果消息已成功发送,则为true。如果返回false   达到超时。错误时抛出interprocess_error。

还要确保传递绝对超时值。