0

私はマルチスレッドアプリケーションを持っていますが、10秒後にウェイクアップして何らかの作業を行うと想定される1つのスレッドが、スリープから復帰しないか、飢えている場合があります。

それは散発的にのみ発生します。

//ACE task svc method
int svc (void)
    {
        while(true)
        {
            ACE_DEBUG((MY_INFO "sleep\n"));
            sleep(10);
            ACE_DEBUG((MY_INFO "awake for HB\n"));
            _csender.sendHeartBeat();
        }

        return 0;
    }

ログの最後の行は次のとおりです。2012-06-1211:34:20.807272 | INFO | sleep

スレッドは15秒間アウェイクしなかったか、アウェイク後15秒まで何の作業も行わなかったため、アプリケーションは閉じました。

アプリケーションには合計6つのスレッドがあり、すべて同じ優先度で開始されます。スレッドの1つは非常にビジーで、大量の市場データを受信して​​処理しますが、ソケットには何も送信しません。上記のスレッドはデータを送信する唯一のスレッドであり、受信側スレッドと送信側スレッドの両方が同じソケットオブジェクトを共有しています。

これはRedHatLinux5.3にあります。

問題になる可能性のあるアイデアはありますか?

4

3 に答える 3

1

「ビジースレッドは2マイクロ秒ごとに2つのACE_DEBUGを出力します」-したがって、デバッガーの出力キューを詰まらせ、このスレッドが「スリープ」キューに入るのを妨げている可能性があります。

それ、および/または他のポスターが示しているように、このスレッドを優先していて、コアを取得できません。

sleep(10)はほとんど無関係です。

于 2012-06-13T17:18:24.830 に答える
0

睡眠は、睡眠に費やされる最大時間についての保証を与えるものではありません。つまり、少なくともその時間、またはそれ以上の時間睡眠します。5秒の遅延を期待するのが妥当かどうかはわかりませんが、長すぎるように聞こえます。

于 2012-06-12T16:19:02.680 に答える
0

ACE_DEBUGにあると思います。スリープ直後にフラッシュを使用してprintfを試しましたか?

于 2012-06-13T15:32:13.197 に答える