winapi模拟java的synchronized / wait()

时间:2013-08-22 08:32:07

标签: multithreading winapi

java的synchronized块就像windows critical section或mutex:一次只能有一个线程进入它 但是有一点不同:当你在synchronized块中调用wait()时,其他线程获得了进入块的能力。不知道如何在winapi中做同样的事情。

这不是解决方案:

LeaveCriticalSection();
// Something important may happen between these calls
WaitForSingleObject();

爪哇:

                    Thread 1            Thread 2            Thread 3
1
2                                       synchronized {
3                                       wait
5                   synchronized {
6                   notifyAll
7                   }
4                                       }
8                                                           synchronized {
9                                                           wait
10                                                          }
11                                      continue            not continue

雷米的变体:

                    Thread 1            Thread 2            Thread 3
1                                       EnterCriticalSection
2                                       ResetEvent
3                                       LeaveCriticalSection
4                   EnterCriticalSection
5                   SetEvent
6                   LeaveCriticalSection
7                                                           EnterCriticalSection
8                                                           ResetEvent
9                                                           LeaveCriticalSection
10                                      WaitForSingleObject WaitForSingleObject
11                                      not continue        not continue

1 个答案:

答案 0 :(得分:0)

根据this tutorial

  

同步代码中调用等待会导致线程放弃锁定并进入休眠状态。这通常会允许另一个线程获得锁定并继续进行一些处理。如果不使用通知 notifyAll 等待方法就毫无意义,它允许等待通知的代码可以唤醒并继续执行。

在Win32 API术语中,这类似于以下内容:

等待线程:

ResetEvent(hWaitEvent);
LeaveCriticalSection(&lock);
WaitForSingleObject(hWaitEvent, INFINITE);
EnterCriticalSection(&lock);

通知线程:

EnterCriticalSection(&lock);
...
SetEvent(hWaitEvent);
LeaveCriticalSection(&lock);

hWaitEvent是使用CreateEvent()创建的可等待事件。