4

Win32 スレッドに対する独自のラッパーの代わりに boost:threads を使用して、C++ アプリの移植性を改善しようとしていますが、正常なスレッド終了の問題が (再び) 頭を悩ませています。

純粋な win32 では、こちら で説明されているように、 QueueUserAPCを使用して「thread_interrupt」例外をスローし、すべての RAII オブジェクトが途中でクリーンアップされるようにすることで、スレッドを「中断」します。「アラート可能な」OS 機能はすべてこの方法で中断される可能性があるため、ミューテックスの待機、スリープ、シリアルおよびソケット I/O などはすべて中断ポイントとなる可能性があります。

ただし、boost:mutex などは、win32 の QueueUserAPC によって「アラート可能」ではありません。SleepEx(n, true) ではなく、Sleep(n) のようなものを呼び出します)。

ブーストスレッドには「割り込み」メカニズム (同様に例外のスローが含まれます) がありますが、boost::thread 呼び出しのみが割り込み可能なため、サードパーティのソケットライブラリ (たとえば) は割り込みできないという欠点があるようです。

何をすべきか?ブーストソースをローカルで変更して中断可能にすることもできますが、それは悪い選択のように感じられ、移植性には役立たないと思います. アプリ全体を再設計して、スレッドの正常なシャットダウンの要件を削除することも、同様に魅力のない方法です...

4

1 に答える 1

1

Win32 の部分的な解決策のアイデアはありますが、まだテストしていません。

私の「スレッド割り込み」メソッドは、両方を呼び出すことができboost::thread.interrupt()、 ANDQueueUserAPCによって呼び出された関数は、ブースト割り込みが制御できるようにするためにQueueUserAPC呼び出すだけです。boost::interruption_point()

これは、ブースト同期オブジェクトまたは「アラート可能な」ネイティブ Windows オブジェクトを待機しているときに、スレッドが中断されることを意味します (ただし、「異なる方法で」)。

于 2010-06-17T08:54:54.037 に答える