Win32 スレッドに対する独自のラッパーの代わりに boost:threads を使用して、C++ アプリの移植性を改善しようとしていますが、正常なスレッド終了の問題が (再び) 頭を悩ませています。
純粋な win32 では、こちら で説明されているように、 QueueUserAPCを使用して「thread_interrupt」例外をスローし、すべての RAII オブジェクトが途中でクリーンアップされるようにすることで、スレッドを「中断」します。「アラート可能な」OS 機能はすべてこの方法で中断される可能性があるため、ミューテックスの待機、スリープ、シリアルおよびソケット I/O などはすべて中断ポイントとなる可能性があります。
ただし、boost:mutex などは、win32 の QueueUserAPC によって「アラート可能」ではありません。SleepEx(n, true) ではなく、Sleep(n) のようなものを呼び出します)。
ブーストスレッドには「割り込み」メカニズム (同様に例外のスローが含まれます) がありますが、boost::thread 呼び出しのみが割り込み可能なため、サードパーティのソケットライブラリ (たとえば) は割り込みできないという欠点があるようです。
何をすべきか?ブーストソースをローカルで変更して中断可能にすることもできますが、それは悪い選択のように感じられ、移植性には役立たないと思います. アプリ全体を再設計して、スレッドの正常なシャットダウンの要件を削除することも、同様に魅力のない方法です...