3

これまでのところ、 C++11 std::thread(mingw 4.8) を使い始めました。sleepExスレッドをアラート可能な待機状態にするために使用されたI/O が重複している状況に遭遇しました。QueueUserAPCこれは、「無効なハンドルエラー」を返すまで使用する必要があるまで、非常にうまく機能しました。

いくつかの検索の後、std::threadWindows で pthread ライブラリを使用していることがわかりました。

でスレッドハンドルを期待する Windows API 呼び出しを使用する方法はありますstd::threadか? それとも、オーバーラップ I/O のために Windows スレッドに固執する必要がありますか?

4

3 に答える 3

5

問題を解決するには、MinGW-w64 winpthreads (使用している pthreads 実装) をpthreads-win32と同様に使用して、pthread のネイティブ Win32 スレッド ハンドルを取得できます。

void * pthread_gethandle (pthread_t t);

これは現在文書化されていない関数であることに注意してください。

pthreads-win32 の対応する関数は次のとおりです。

HANDLE pthread_getw32threadhandle_np(pthread_t thread);

これにより、2 つの作業が混在するようになるか、少なくとも修正可能な winpthreads のバグが明らかになるでしょう。後者の場合は、MinGW-w64 に報告してください。

上記で無効なハンドルが返された場合は、MinGW-w64-public メーリング リストで質問するのが最善の策です (最初に登録してください。そうしないと、ばかげた手動モデレーションを待つ必要があります)。

于 2013-10-08T14:45:51.587 に答える
3

std::thread でスレッド ハンドルを期待する Windows API 呼び出しを使用する方法はありますか?

いいえ、std::threadMinGW ビルドの はスレッド ハンドルに関して実装されていないためです。 編集:それは間接的ですが、からネイティブスレッドハンドルを取得する方法については rubenvb の回答を参照してpthread_tください。std::thread::native_handle()pthread_t

C++11 スレッド ライブラリがネイティブ Windows スレッドを直接使用するために必要なサポートを GCC で実装した人はいません。

ネイティブのミューテックスと条件変数の観点から実装される新しいスレッド モデルについて、いくつかのアイデアがありました。std::thread::native_handle()これにより、Windows API で使用する基になるスレッド ハンドルを取得するために呼び出すことができます。

変更を適用してGCCを再構築するところまで行きましたが、テストできませんでした。私の提案にはほとんど興味がなく、MinGW の貢献者からの支援の申し出もありませんでした。私は Windows ユーザーではなく、Windows での作業と MinGW の構築は非常に苦痛でイライラするものだったので、あきらめました。私より忍耐力のある誰かがいつの日か作業を完了できるように、変更をオンラインのどこかに置く必要があります。

于 2013-10-08T14:16:48.613 に答える