3

このアプリケーションでは、同期メカニズムを実行するために、CreateEvent、SetEvent / ResetEventを使用して、win32HANDLEを多用しています。

私の同僚から、イベントのハンドルにアクセスするのはスレッドセーフかどうか尋ねられました。

HANDLEはGDIオブジェクトに対してスレッドセーフではないため、答えることができませんでした...

しかし、イベントはマルチスレッド同期を目的としているため、スレッドセーフではないとは想像できませんでした。

これを確認してもらえますか?

4

2 に答える 2

2

関数のMSDNライブラリの記事で明示的に言及されていない限り、Kernel32の関数から取得するすべてのハンドルはスレッドセーフです。コードから簡単に見分ける方法があります。そのようなハンドルはCloseHandle()で閉じられます。

ハンドルを使用して行うことは、必ずしもスレッドセーフであるとは限りません。SetEvent()を2回呼び出すと、Windowsは役に立ちませんが、WaitForSingleObject()は1回だけ呼び出します。イベントの使用方法によっては、プログラムでのスレッド化の可能性があります。

于 2012-08-31T11:16:41.427 に答える
1

ハンドルの種類によって異なります。

同期ハンドル(CreateEventによって作成されたものなど)は、定義上、スレッドセーフです。複数のスレッドによって同時に書き込まれる場合のファイルハンドルは、それほど多くはありません。

于 2012-08-31T09:46:41.787 に答える