0

我有一个多线程应用程序,但有时一个线程应该在 10 秒后醒来并做一些工作,但不会从睡眠中醒来或饿死。

它只是偶尔发生。

//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-12 11:34:20.807272|INFO|sleep

线程要么没有唤醒 15 秒,要么在唤醒后直到第 15 秒才做任何工作,因此应用程序关闭。

应用程序中共有 6 个线程,所有线程都以相同的优先级启动。其中一个线程非常繁忙,它接收大量市场数据并对其进行处理,但不会在套接字上发送任何内容。上面的线程是唯一发送数据的线程,接收者和发送者线程共享同一个套接字对象。

这是在红帽 linux 5.3 上。

任何想法可能是什么问题?

4

3 回答 3

1

'繁忙的线程每 2 微秒打印 2 个 ACE_DEBUG' - 因此可能会阻塞调试器的输出队列并阻止该线程进入排队其“睡眠\n”。

那个,和/或你已经优先考虑这个线程并且它无法获得核心,正如其他海报所指出的那样。

sleep(10) 几乎是无关紧要的。

于 2012-06-13T17:18:24.830 回答
0

我认为它在 ACE_DEBUG 中。您是否在睡眠后立即尝试使用冲洗的 printf ?

于 2012-06-13T15:32:13.197 回答
0

睡眠不能保证睡眠的最大时间,即您至少睡了那个时间,或者更长的时间。我不知道期待 5 秒的延迟是否合理,这听起来太长了。

于 2012-06-12T16:19:02.680 回答