【问题标题】:boost::interprocess::timed_receive() never returns if sending process halts如果发送进程停止, boost::interprocess::timed_receive() 永远不会返回
【发布时间】:2014-02-15 02:01:36
【问题描述】:

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

那么在我尝试接收数据之前,我可以在我的队列上调用一个函数,它告诉我发送进程是否已经终止或停止?

【问题讨论】:

    标签: c++ winapi boost boost-interprocess


    【解决方案1】:

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

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

    • 队列为空,超时值未过期
    • 您遇到了死锁场景。

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

    bool timed_receive(void * buffer, std::size_t buffer_size, std::size_t & recvd_size,无符号整数 & 优先级, 常量提升::posix_time::ptime & abs_time);

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

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

    【讨论】:

    • 好的,这可能只是我的一个误解。我在调试器中暂停了发送方以测试超时。我预计接收器会超时并退出。但我认为陷入共享互斥锁实际上是有道理的:发件人仍然活着但没有响应。相反,如果我杀死发件人,超时确实会按预期发生。
    • @DavidM.Cotter 很高兴听到!
    猜你喜欢
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多