Ped*_*ino 7 c++ concurrency synchronization boost boost-interprocess
我的场景:一台服务器和一些客户端(虽然不多).服务器一次只能响应一个客户端,因此必须排队.我正在使用互斥(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以使用强大的互斥锁,并以某种方式处理从pthread_mutex_lock返回的EOWNERDEAD .
如果您在其他平台上,则可以编辑boost/interprocess/sync/emulation/interprocess_mutex.hpp以使用生成计数器,并在较低位中使用锁定标志.然后你可以创建一个回收协议,它将在锁定字中设置一个标志来指示挂起的回收,然后在超时后进行比较和交换,以检查同一代是否仍在锁定字中,如果是,则替换它具有锁定的下一代价值.
如果你在Windows上,另一个好的选择是使用本机互斥对象; 无论如何,他们可能比忙碌更有效率.
您可能还想重新考虑使用共享内存协议 - 为什么不使用网络协议呢?