1

特定の時間枠内にデータ リソースがアクセスされたかどうかをチェックし、そうでない場合は接続をクリアする単純なポーリング スレッド ( Boost 1.39.0 を使用) を開発しました。関連するコードは以下で確認できます。

私の懸念は 2 つあります。

1) スレッドを安全に閉じるために、スリープ中に割り込みを使用することは適切ですか? 割り込みはスリープが終了するのを待ちますか、それともすぐに割り込みますか? while ループをエスケープするためだけに、thread_interrupted 例外をキャッチしていることがわかります。

2) ほとんどの時間を眠っているスレッドを使用するのは無駄ですか? 標準 C++ で単純なポーリング メカニズムを実装するためのより良いパターンはありますか?

boost::xtime xt;

while (1) {
    try {
        boost::xtime_get(&xt, boost::TIME_UTC);
        xt.sec += _sleep_secs;
        boost::thread::sleep(xt);
        //
        // logic to check resource access
        // etc.
    } 
    catch(boost::thread_interrupted const&) {
        return;
    }
}
4

2 に答える 2

2

1) POSIX スレッド用の boost::thread::interrupt() の Boost 実装から判断すると、安全である必要があります。

void thread::interrupt()
{
    detail::thread_data_ptr const local_thread_info=get_thread_info();
    if(local_thread_info)
    {
        lock_guard<mutex> lk(local_thread_info->data_mutex);
        local_thread_info->interrupt_requested=true;
        if(local_thread_info->current_cond)
        {
            BOOST_VERIFY(!pthread_cond_broadcast(local_thread_info->current_cond));
        }
    }
}

ミューテックスをロックし、interrupt_requested を true に設定し、条件変数でブロードキャストします。また、boost::thread::sleep() でスレッドがスリープしている場合、スレッドはすぐにウェイクアップされます。そして、スレッドをキャンセルするために pthread_cancel を使用しません。

2) Windows、Linux、HP-UX などのオペレーティング システムについて話す場合、1 つのスレッドがリソースの無駄になるとは思いません。これは、この点を裏付ける引用です。

また、多くの OS では、数百を超えるスレッドの処理に問題があります。各スレッドが 2MB のスタックを取得する場合 (珍しいデフォルト値ではありません)、(2^30 / 2^21) = 512 スレッドで、1GB のユーザー アクセス可能な VM を備えた 32 ビット マシンで仮想メモリが不足します (たとえば、 Linux は通常 x86 で出荷されます)

.

于 2009-10-23T13:58:41.130 に答える
0

使用は完全に問題ないと思います。多くの人がそれを使用しています(スレッドを閉じる必要がある場合、シャットダウンシーケンスを考えてください-すべてを中断すると、シャットダウンできます)。

ただし、ブーストに関しては、必ずドキュメントを読んでください。特に、「割り込みポイント」はほんの一握りの命令のみです。つまり、スレッドが中断され、その命令の実行中に中断した場合にのみ例外が発生します。スレッドが何か他のことをしている場合、スレッドでinterrupt何をしているかによっては、を要求してからしばらく時間がかかる可能性がある中断ポイントに入ったときにのみ割り込みが発生します。

いずれにせよそれは真実だと思います、それが私が次のように解釈する方法です:

スレッドは、次に割り込みが有効な事前定義された中断ポイントの 1 つに入ったとき、または割り込みが有効な事前定義された中断ポイントの 1 つへの呼び出しで現在ブロックされている場合に中断されます。

ブーストスレッドのドキュメントから

于 2009-11-20T12:16:36.257 に答える