ドキュメントには、スレッドBが割り込みを再度有効にしたときに割り込みが再トリガーされるとは記載されていません。簡単なテストプログラムを試しましたが、説明した動作を確認できます。
割り込みを再度有効にした後this_thread::interruption_requested()
、割り込みが無効になっているときにリクエストされた割り込みがあったかどうかを確認できます。実際に中断が要求された場合は、thread_interrupted
自分で例外をスローできます。
これを実証する実用的なプログラムは次のとおりです。
#include <boost/thread.hpp>
#include <iostream>
using namespace std;
using namespace boost;
void threadB()
{
int ticks = 0;
this_thread::disable_interruption* disabler = 0;
try
{
while (ticks < 20)
{
if (ticks == 5)
{
cout << "Disabling interruptions\n";
disabler = new this_thread::disable_interruption;
}
if (ticks == 15)
{
cout << "Re-enabling interruptions\n";
delete disabler;
if (this_thread::interruption_requested())
{
cout << "Interrupt requested while disabled\n";
throw thread_interrupted();
}
}
cout << "Tick " << ticks << "\n";
thread::sleep(get_system_time() + posix_time::milliseconds(100));
++ticks;
}
}
catch (thread_interrupted)
{
cout << "Interrupted\n";
}
}
int main()
{
thread b(&threadB);
thread::sleep(get_system_time() + posix_time::milliseconds(1000));
b.interrupt();
cout << "main -> Interrupt!\n";
b.join();
}
お役に立てれば。