我的场景:一台服务器和一些客户端(虽然不多)。服务器一次只能响应一个客户端,因此必须排队。我正在使用互斥锁 ( boost::interprocess::interprocess_mutex
) 来执行此操作,包裹在boost::interprocess::scoped_lock
.
问题是,如果一个客户端在持有互斥锁时意外死亡(即没有析构函数运行),其他客户端就会遇到麻烦,因为它们正在等待该互斥锁。我考虑过使用定时等待,所以如果我的客户端等待 20 秒并且没有获得互斥锁,它会继续与服务器对话。
这种方法的问题:1)它每次都这样做。如果它处于循环中,不断与服务器通信,则每次都需要等待超时。2)如果有三个客户端,其中一个在持有互斥锁时死亡,另外两个将等待 20 秒并同时与服务器通信——这正是我试图避免的。
那么,我怎么能对客户说,“嘿,看来这个互斥体已被放弃,拥有它”?