将write-lock降级为读锁时TMultiReadExclusiveWriteSynchronizer的行为

时间:2014-07-16 01:12:57

标签: c++ multithreading c++builder

以下代码导致我的应用程序冻结,即使该程序只有一个线程正在运行。

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()时,程序冻结,如果我停止它,那么有两个线程。我的主线程处于汇编域但是调用堆栈是{{1 }} - &GT; WaitForSingleObject - &GT; WaitForSingleObjectEx

ZwWaitForSingleObject的入口点还有第二个没有堆栈信息的线程。我假设这个线程只是为了让我能够暂停应用程序。我的代码中没有任何内容可以在此时创建第二个线程。

1 个答案:

答案 0 :(得分:0)

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

// 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.