【发布时间】:2016-04-24 10:03:56
【问题描述】:
我遇到了关于消息队列的问题:
- 我已使用 mq_timedreceive() 在 abs_timeout 时间内获取消息队列。 但是这个函数受系统时间(CLOCK_REALTIME)的影响。我的意思是当系统时间发生变化时,abs_timeout(绝对时间)就不再正确了。
为了解决这个问题,我意识到它应该改为 CLOCK_MONOTOIC 时钟。 但是在linux下是没有办法的(我搜了一下发现QNX支持这个机制)。
最后,我将 select() 和 mq_timereceive 与 NO_WAIT 结合起来。 + select():使用相对时间,因此不受系统时间变化的影响。 超时后,我会用mq_timereceive()获取消息队列,当然绝对时间=0;
但我的问题是: 如果系统有很多线程在等待同一个消息队列(使用 select()),
- 如果一条消息被发送到消息队列,所有等待的线程都被唤醒并运行。所以这是错误的。
- 可能有一个线程(不是第一个等待线程)首先醒来并收到此消息。
- 我的预期是只有第一个等待线程应该被唤醒并且它会收到消息,而其他线程仍然阻塞。 请帮忙。
【问题讨论】:
标签: linux multithreading