How do I take ownership of an abandoned boost::interprocess::interprocess_mutex?

前端 未结 1 1140
深忆病人
深忆病人 2020-12-17 00:47

My scenario: one server and some clients (though not many). The server can only respond to one client at a time, so they must be queued up. I\'m using a mutex (boost::

相关标签:
1条回答
  • 2020-12-17 01:31

    Unfortunately, this isn't supported by the boost::interprocess API as-is. There are a few ways you could implement it however:

    If you are on a POSIX platform with support for pthread_mutexattr_setrobust_np, edit boost/interprocess/sync/posix/thread_helpers.hpp and boost/interprocess/sync/posix/interprocess_mutex.hpp to use robust mutexes, and to handle somehow the EOWNERDEAD return from pthread_mutex_lock.

    If you are on some other platform, you could edit boost/interprocess/sync/emulation/interprocess_mutex.hpp to use a generation counter, with the locked flag in the lower bit. Then you can create a reclaim protocol that will set a flag in the lock word to indicate a pending reclaim, then do a compare-and-swap after a timeout to check that the same generation is still in the lock word, and if so replace it with a locked next-generation value.

    If you're on windows, another good option would be to use native mutex objects; they'll likely be more efficient than busy-waiting anyway.

    You may also want to reconsider the use of a shared-memory protocol - why not use a network protocol instead?

    0 讨论(0)
提交回复
热议问题