2

クリティカルセクションを実装し、VC ++で一部のアレイを保護しているとしましょう。VC++でロックを使用してそれを行うにはどうすればよいですか?

4

3 に答える 3

10

クリティカルセクションのAPI関数が必要です:

  • InitializeCriticalSectionロックを初期化するために、任意のスレッド(通常はメインスレッド)から1回呼び出します。他のことをする前に初期化してください。
  • EnterCriticalSectionロックを取得するには、任意のスレッドから呼び出します。別のスレッドにロックがある場合、ロックを取得できるようになるまでブロックされます。クリティカルセクションは再入可能です。つまり、スレッドがすでにロックを保持している場合でも、ロックを正常に取得できます。
  • LeaveCriticalSectionロックを解除します。への各呼び出しは、へEnterCriticalSectionの一致する呼び出しとペアにする必要がありますLeaveCriticalSection。これらの取得/解放呼び出しのペアリングを例外で停止させないでください。
  • DeleteCriticalSectionロックを完了するには、任意のスレッド(通常はメインスレッド)から1回呼び出します。ロックを保持しているスレッドがない場合にこれを行います。これを呼び出した後、ロックは無効になり、再度取得することはできません。

MSDNは、簡単な例を提供してくれます。

MFCを使用している場合は、おそらくCCriticalSectionWin32クリティカルセクションAPIをクラスにまとめたものを使用します。

アレイでそれを行う方法については。スレッドは、一度に1つずつロックで保護されたコードのブロックのみを実行します。2つのスレッドが同じメモリ位置に同時に読み取り/書き込みを試みる競合状態、または実際にアルゴリズムを壊す可能性のある他のより微妙な状態を停止するには、ロックが必要です。

配列、その内容、および配列の操作方法を説明する場合は、具体的なアドバイスを提供できる可能性があります。このアレイをどのように操作するかは、理想的な同期戦略に大きく影響し、場合によっては、ロックフリーの方法を使用できる場合があります。

于 2011-02-19T23:30:05.690 に答える
2

CreateMutexを介してミューテックスを作成し、WaitForSingleObjectを介してその所有権を取得し、 ReleaseMutexを介してミューテックスの所有権を解放し、 CloseHandleが終了したら削除します。

検索できる代替手段には、CriticalSectionsSemaphores、およびEventsがあります。

于 2011-02-19T23:12:00.400 に答える
0

VS 2010を使用している場合、criticial_sectionオブジェクトはヘッダーファイルppl.hに含まれています。

同期されたクラステンプレートもあることに注意してくださいconcurrent_vector(つまり、ロックは必要ありません)。

于 2011-02-20T00:08:37.817 に答える