1

Java の同期ブロックは、Windows のクリティカル セクションまたはミューテックスに似ています。一度に 1 つのスレッドしか入ることができません。
ただし、違いがあります。同期ブロック内で 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
4

1 に答える 1

0

このチュートリアルによると:

同期されたコード内からのwaitの呼び出しにより、スレッドはロックを放棄し、スリープ状態になります。これは通常、別のスレッドがロックを取得して何らかの処理を続行できるようにするために起こります。waitメソッドは、 notifyまたはnotifyAllを使用しないと意味がありません。これにより、待機中のコードは、ウェイクアップして実行を継続できるという通知を受け取ることができます。

Win32 API 用語では、これは次のようなものに相当します。

待機中のスレッド:

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

通知スレッド:

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

hWaitEventで作成された待機可能なイベントはどこにありますかCreateEvent()

于 2013-08-22T08:54:34.400 に答える