为什么boost的进程间互斥在posix上不健壮?

时间:2016-11-06 17:41:21

标签: c++ boost boost-mutex

我非常擅长提升,并试图理解其中的一小部分 - 进程间互斥。

AFAIU,在使用文件锁的跨平台实现中有一个强大的互斥模拟:http://www.boost.org/doc/libs/1_62_0/boost/interprocess/detail/robust_emulation.hpp

这用于模拟posix标准中可用的强大互斥锁,但只有在平台特定版本不可用时才会使用通用方法。

#if !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && defined (BOOST_INTERPROCESS_POSIX_PROCESS_SHARED)
   #include <boost/interprocess/sync/posix/mutex.hpp>
   #define BOOST_INTERPROCESS_USE_POSIX
//Experimental...
#elif !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && defined (BOOST_INTERPROCESS_WINDOWS)
   #include <boost/interprocess/sync/windows/mutex.hpp>
   #define BOOST_INTERPROCESS_USE_WINDOWS
#elif !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
   #include <boost/interprocess/sync/spin/mutex.hpp>
   #define BOOST_INTERPROCESS_USE_GENERIC_EMULATION

但是在真正支持强健互斥体的posix系统上(我猜它取决于内核版本),实际上没有启用健壮的互斥锁。 http://www.boost.org/doc/libs/1_62_0/boost/interprocess/sync/posix/pthread_helpers.hpp

所以我真的不明白这里的逻辑,有没有严重的性能损失与posix强大的互斥量实现,所以我们不想使用它?即便如此,至少应该有一个选项来选择性地启用此功能。

要解决这个问题,正如我要提升的那样,有没有什么方法可以通过posix实现提供通用实现,以便我可以利用鲁棒性?

1 个答案:

答案 0 :(得分:0)

我只是在boost / interprocess / sync / posix / pthread_helpers.hpp文件中研究了用于互斥互斥的包装类的boost实现。 我看到缺少PTHREAD_MUTEX_ROBUST。 请按如下所示添加ROBUST属性,然后尝试。

mutexattr_wrapper(bool recursive = false)
 {
         if(pthread_mutexattr_init(&m_attr)!=0 ||
            pthread_mutexattr_setpshared(&m_attr, PTHREAD_PROCESS_SHARED)!= 0 ||
             (recursive &&
              pthread_mutexattr_settype(&m_attr, PTHREAD_MUTEX_RECURSIVE)!= 0 ) ||
              pthread_mutexattr_setrobust(&m_attr, PTHREAD_MUTEX_ROBUST)!= 0)
            throw interprocess_exception("pthread_mutexattr_xxxx failed");
}