C++ 线程没有从睡眠中醒来

C++ 线程没有从睡眠中醒来,c++,multithreading,pthreads,ace,thread-sleep,C++,Multithreading,Pthreads,Ace,Thread Sleep,我有一个多线程应用程序,但有时一个线程在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"));

我有一个多线程应用程序,但有时一个线程在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 |信息|睡眠

线程在15秒内没有唤醒,或者直到15秒才唤醒,所以应用程序关闭

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

这是在red hat linux 5.3上实现的


你知道问题出在哪里吗?

睡眠并不能保证睡眠的最长时间,也就是说,你至少睡了那么长的时间,或者更长的时间。我不知道5秒的延迟是否合理,但听起来太长了。

我认为这是在ACE_调试中。您是否在睡眠后立即尝试了带刷新的printf?

'Busy thread is prints 2 ACE\u DEBUGs every 2 micross'-因此可能会阻塞调试器的输出队列,并阻止此线程进入其“睡眠\n”队列

正如其他海报所指出的那样,你已经把这条线划分了优先级,它无法获得核心


睡眠(10)几乎是一种解脱。

你是说15分钟?您的“非常忙”线程是否经常使用ACE_DEBUG()呢?实际上是15秒。:),Busy thread is prints 2 ACE_每2微秒进行一次调试,告诉我们调试的目的是什么,但问题也发生在没有ACE_调试语句的情况下。ACE_调试是什么样子的?您是否碰巧为任何线程设置了不同的优先级?如果不是这样的话,我会怀疑在睡眠之后出现的任何代码,而不是睡眠本身。例如,如果在睡眠后在线路上插入断点或打印(到任何其他调用都不使用的文件),它是否会被击中?