ReadExclusiveWriteSynchronizer在将

ReadExclusiveWriteSynchronizer在将

即使程序仅运行一个线程,以下代码也会导致我的应用程序冻结。

semaphoreboost::shared_ptr<TMultiReadExclusiveWriteSynchronizer>

if (semaphore)
{
  semaphore->BeginWrite();

  // Perform write operations on the shared object here.

  semaphore->BeginRead();
  semaphore->EndWrite();

  // Perform read-only operations on the object, allowing other threads to also read.

  semaphore->EndRead();
  semaphore->BeginWrite(); // Program locks up here.
}




调试信息,用于@ v.ouddou注释。

当我单步执行代码时,只有一个线程。顺便说一下,这是一个窗口化的应用程序,因此,程序入口点是WinMain(如果重要)。

当我进入死亡线(最后一个semaphore->BeginWrite()时,程序冻结,如果我停止它,则有两个线程。我的主线程在汇编区域中,但调用堆栈为WaitForSingleObject-> WaitForSingleObjectEx -> ZwWaitForSingleObject

RtlUserThreadStart的入口点还有另一个没有堆栈信息的线程。我认为这个线程只是为了使我能够暂停应用程序而创建的。此时,在我的代码中没有任何意义创建第二个线程。

最佳答案

这似乎已经解决了问题。但是,它需要添加一个关键部分来防止读取期间的死锁。

// Care: Two threads attempting to acquire the locks here would deadlock.
critical_section->Acquire();
semaphore->BeginRead();
semaphore->BeginWrite();
critical_section->Leave();

// Perform write operations on the shared object here.

semaphore->EndWrite();

// Perform read-only operations on the object, allowing other threads to also read.

semaphore->EndRead();

semaphore->BeginWrite(); // No longer deadlocks.

关于c++ - TMultiReadExclusiveWriteSynchronizer在将写锁降级为读锁时的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24770664/

10-11 15:53