2

1) この投稿からの回答WaitForSingleObject : how to get handle from _beginthreadexは、uintptr_t から返された _beginthreadex を HANDLE 型にキャストすることのみが合法であると言います。

2) 32 ビット アプリケーションで以下のようにキャストしましたが、うまく動作しているようですが、このアプリケーションを 64 ビットに変換すると何か問題が発生しますか? HANDLE スレッド = (HANDLE)_beginthread(checkThread, 0, &thrVal);

3) すべての _beginthread 呼び出しを _beginthreadex に変換する価値はありますか?

4

2 に答える 2

2

Windows 同期 API を使用する場合は、ユーザーHANDLEコントロールが必要です。uintptr_t返された fromを使用して、同期 API で使用_beginthreadする値に安全にキャストすることはできません。_beginthread、_beginthradexHANDLEのドキュメントは、ここで非常に明確です (私の強調):

_beginthreadex によって返されるスレッド ハンドルを同期 API で使用することもできますが、これは _beginthread では実行できません

文書化されていない動作に依存したくない場合は、同期 API で使用する値_beginthreadexが必要な場合に使用する必要があります。HANDLE

于 2013-10-17T22:18:50.733 に答える
0

リンクした質問への回答は誤解を招くか、少なくとも不完全だと思います。andのドキュメントによるbeginthread()beginthreadex()

成功した場合、これらの関数はそれぞれ、新しく作成されたスレッドへのハンドルを返します

2 つの違いは、スレッドがbeginthread()終了するときに独自のハンドルを閉じることによって開始されることです。beginthread()そのため、待機するまでにハンドルが閉じられているか、リサイクルされている可能性があるため、によって返されたハンドルを待機するのは安全ではありません。ただし、(他の形式の同期を使用して) 起動したスレッドを制御できる場合DuplicateHandle()は、安全に待機できるハンドルを取得するために呼び出すことができます。

x64 ビルドでuintptr_tは、64 ビット値として定義されます。

typedef unsigned __int64    uintptr_t;

したがって、この場合にこれを a にキャストすることHANDLEは安全であり、実際にあなたが意図していることです。

_beginthreadex()サスペンド状態で開始したり、スレッド ID を取得したりする機能など、新しいスレッドをより詳細に制御できます。また、閉じる責任があるHANDLEこと示す a も返します。これは、それを待っても安全であることを意味します。より便利で用途の広い機能ですが、これらの追加機能が必要ない場合は、そのためだけに切り替える理由はありません。

于 2013-10-17T22:13:02.057 に答える