2

私のコードACE_Mutexでは、pthreadを備えたシステム(QNX)のACEライブラリから使用しています。今、のデストラクタがをACE_Mutex呼び出さないように見えるという問題が発生していますpthread_mutex_destroy。これは、同じメモリ位置にある後続のミューテックスが初期化されるときに問題を引き起こします。これは、 ()をpthread_mutex_init返すためです。errno=16EBUSY

ACE_Mutex::removeMutex.inl内の)のコードを見ると、奇妙なプリコンパイラディレクティブのセットがあります。

ACE_INLINE int
ACE_Mutex::remove (void)
{
// ACE_TRACE ("ACE_Mutex::remove");
  int result = 0;
#if defined (ACE_HAS_PTHREADS) || defined (ACE_HAS_STHREADS)
  // In the case of a interprocess mutex, the owner is the first
  // process that created the shared memory object. In this case, the
  // lockname_ pointer will be non-zero (points to allocated memory
  // for the name).  Owner or not, the memory needs to be unmapped
  // from the process.  If we are the owner, the file used for
  // shm_open needs to be deleted as well.
  if (this->process_lock_)
    {
      if (this->removed_ == false)
        {
          this->removed_ = true;
          // Only destroy the lock if we're the ones who initialized
          // it.
          if (!this->lockname_)
            ACE_OS::munmap ((void *) this->process_lock_,
                            sizeof (ACE_mutex_t));
          else
            {
              result = ACE_OS::mutex_destroy (this->process_lock_);
              ACE_OS::munmap ((void *) this->process_lock_,
                              sizeof (ACE_mutex_t));
              ACE_OS::shm_unlink (this->lockname_);
              ACE_OS::free (
                static_cast<void *> (
                  const_cast<ACE_TCHAR *> (this->lockname_)));
            }
        }
    }
  else
  {
#else /* !ACE_HAS_PTHREADS && !ACE_HAS_STHREADS */
    if (this->removed_ == false)
      {
        this->removed_ = true;
        result = ACE_OS::mutex_destroy (&this->lock_);
      }
#endif /* ACE_HAS_PTHREADS || ACE_HAS_STHREADS */
#if defined (ACE_HAS_PTHREADS) || defined (ACE_HAS_STHREADS)
  }
#endif /* ACE_HAS_PTHREADS || ACE_HAS_STHREADS */
  return result;
}

ACE_OS::mutex_destroy具体的には、toの呼び出しが条件付きであり、pthreadが有効になっているときに呼び出されない理由がわかりません。これにより、removeプロセス間ミューテックス以外のメソッドが効果的に空のボディになります。誰かがこのコードの理論的根拠を説明できますか?

4

0 に答える 0