gpt4 book ai didi

c++ - 我如何获得废弃的 boost::interprocess::interprocess_mutex 的所有权?

转载 作者:可可西里 更新时间:2023-11-01 18:30:08 27 4
gpt4 key购买 nike

我的场景:一台服务器和一些客户端(虽然不多)。服务器一次只能响应一个客户端,因此他们必须排队。我正在使用互斥量 (boost::interprocess::interprocess_mutex) 来执行此操作,它封装在 boost::interprocess::scoped_lock 中。

问题是,如果一个客户端在持有互斥量时意外死亡(即没有析构函数运行),其他客户端就会有麻烦,因为它们正在等待该互斥量。我考虑过使用定时等待,所以如果我的客户端等待 20 秒但没有获得互斥锁,它会继续与服务器通信。

这种方法的问题:1) 它每次都这样做。如果它处于循环中,不断与服务器对话,则每次都需要等待超时。 2) 如果有三个客户端,其中一个在持有互斥量时死机,另外两个将等待 20 秒并同时与服务器通信——这正是我试图避免的。

那么,我怎么能对客户说,“嘿,看来这个互斥锁已经被放弃了,拥有它吧”?

最佳答案

不幸的是,boost::interprocess API 不支持它。但是,您可以通过几种方式实现它:

如果您使用的是支持 pthread_mutexattr_setrobust_np 的 POSIX 平台,请编辑 boost/interprocess/sync/posix/thread_helpers.hpp 和 boost/interprocess/sync/posix/interprocess_mutex.hpp 以使用健壮的互斥体,并以某种方式处理 EOWNERDEAD从 pthread_mutex_lock 返回。

如果您在其他平台上,您可以编辑 boost/interprocess/sync/emulation/interprocess_mutex.hpp 以使用生成计数器,并在低位设置锁定标志。然后您可以创建一个回收协议(protocol),该协议(protocol)将在锁定字中设置一个标志以指示待处理的回收,然后在超时后进行比较和交换以检查同一代是否仍在锁定字中,如果是则替换它具有锁定的下一代值(value)。

如果您使用的是 Windows,另一个不错的选择是使用 native 互斥对象;无论如何,它们可能比忙等待更有效率。

您可能还想重新考虑共享内存协议(protocol)的使用 - 为什么不改用网络协议(protocol)呢?

关于c++ - 我如何获得废弃的 boost::interprocess::interprocess_mutex 的所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1179685/

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