使用window api临界区和事件引起的死锁

时间:2013-03-18 08:04:42

标签: c++ winapi

线程1

...     SetEvent(_event);

EnterCriticalSection(crit);

ResetEvent(_event);

LeaveCriticalSection(crit);

主题2:

EnterCriticalSection(crit);

WaitForSingleObject(_event, forever);

LeaveCriticalSection(crit);

当线程1设置事件时,线程2仍在等待并永远等待。所以,Thead 1试图获得锁定,但未能陷入僵局。我检查SetEvent的返回值是否正常。

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

1 个答案:

答案 0 :(得分:4)

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

线程1

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

主题2:

WaitForSingleObject(_event, forever);

这就是你所需要的一切。