2

线程 1

... SetEvent(_event);

EnterCriticalSection(crit);

ResetEvent(_event);

LeaveCriticalSection(crit);

线程 2:

EnterCriticalSection(crit);

WaitForSingleObject(_event, forever);

LeaveCriticalSection(crit);

当 Thread 1 设置 Event 时,Thread 2 还在等待,永远等待。因此,Thead 1 尝试获取锁,但未能死锁。我检查了 SetEvent 的返回值,这没问题。

删除线程1的EnterCriticalSection和LeaveCriticalSection,多次调用SetEvent后发现事件仍未设置

4

1 回答 1

5

没有理由用临界区包装事件。该事件本身提供了足够的线程同步,因此完全摆脱了临界区。

线程 1

SetEvent(_event); // Or PulseEvent(), depending on the nature of the event

线程 2:

WaitForSingleObject(_event, forever);

这就是你所需要的。

于 2013-03-18T08:29:54.920 回答