我如何采取一个废弃的boost ::进程间:: interprocess_mutex的所有权?(Ho

2019-06-26 17:56发布

我的情况:一台服务器和一些客户端(虽然不是很多)。 服务器可以只给一个响应客户端的时间,所以他们必须排队。 我使用的是互斥( boost::interprocess::interprocess_mutex )要做到这一点,包裹在一个boost::interprocess::scoped_lock

问题是,如果一个客户端意外死亡(即没有析构函数运行)同时持有互斥锁,其他客户端都遇到了麻烦,因为他们对互斥等待。 我已经使用定时的等待考虑,所以如果我客户端等待,比如20秒,没有得到互斥体,它会开始谈判到服务器反正。

这种方法存在的问题:1)它这样做每次。 如果是在一个循环中,不断念叨到服务器,它需要等待每一次超时。 2)如果有三个客户,其中一人在持有互斥锁死亡,另2只等待20秒,并在同一时间跟服务器 - 正是我一直在试图避免的。

所以, 我怎么能到客户端,“嘿,看来这互斥体已被抛弃,它的所有权”之说?

Answer 1:

不幸的是,这不是由升压::进程间的API为 - 是支持的。 然而有,你可以实现它的几种方法:

如果你是一个POSIX平台与pthread_mutexattr_setrobust_np的支持,编辑升压/间/同步/ POSIX / thread_helpers.hpp和提升/间/同步/ POSIX / interprocess_mutex.hpp使用强大的互斥体,并以某种方式处理的pthread_mutex_lock从该回EOWNERDEAD 。

如果你是在一些其他的平台,您可以编辑升压/间/同步/模拟/ interprocess_mutex.hpp在低位用一代计数器,与被锁定的标志。 然后,你可以创建一个回收协议,将在锁定字设置一个标志,指示待定回收,然后做一个比较并交换在超时后检查同代仍处于锁定字,如果是更换它锁定的下一代值。

如果您使用的是Windows,另一个很好的选择是使用本地互斥对象; 他们很可能会比忙等待无论如何效率更高。

您可能还需要重新考虑使用共享内存协议 - 为什么不使用的网络协议呢?



文章来源: How do I take ownership of an abandoned boost::interprocess::interprocess_mutex?