1

boost :: threadsを使用しているときに、この中断の問題に遭遇しました。スレッドBのスレッドAからboost::thread_interruptを実行すると、Bで割り込みが無効になっているときに(boost :: this_thread :: disable_interrupts di)、割り込みが失われたように見えます。つまり、割り込みを有効にした後でboost :: thread ::interruption_point()を設定しても、boost::thread_interrupted例外はスローされません。

これは予想される動作ですか、それとも私は何か間違ったことをしていますか?

ありがとう

4

1 に答える 1

4

ドキュメントには、スレッド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();
}

お役に立てれば。

于 2011-03-02T19:38:09.553 に答える