首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linux中的选择()、posix消息队列和多线程

Linux中的选择()、posix消息队列和多线程
EN

Stack Overflow用户
提问于 2016-04-24 10:03:56
回答 1查看 2.3K关注 0票数 2

我面临一个关于消息队列的问题:

  • 我使用mq_timedreceive()在abs_timeout时获取消息队列。但这一功能受系统时间(CLOCK_REALTIME)的影响。我的意思是,当系统时间改变时,abs_timeout (绝对时间)不再正确。

为了解决这个问题,我意识到它应该改为CLOCK_MONOTOIC时钟。但是在linux中,没有办法(我搜索并发现QNX支持这种机制)。

最后,我将select()和mq_timereceive与NO_WAIT结合起来。+ select():使用相对时间,因此不受系统时间变化的影响。超时之后,我将得到带有mq_timereceive()的消息队列,当然绝对时间= 0;

但是我的问题是:如果系统中有许多线程在等待相同的消息队列(通过使用select()),

  • 如果消息被发送到消息队列,所有等待的线程都会被唤醒并运行。所以这是错误的。
  • 也许一个线程(不是第一个等待线程)首先醒来并得到这条消息。
  • 我所期待的只是第一个等待线程应该唤醒,它会得到消息,而其他仍然阻塞。请帮帮忙。
EN

回答 1

Stack Overflow用户

发布于 2016-04-24 13:57:47

看起来你有几个问题在一个:

  1. 等待具有不受时钟调整影响的超时的消息队列。在Linux中,以下API支持时钟(CLOCK_REALTIMECLOCK_MONOTONIC等)选择:timerfd_createtimer_create。将它们与mq_timedreceive集成的一种方法是让timer_create触发一个中断mq_timedreceive的信号。
  2. 将POSIX消息队列上的等待与select集成。最直接的方法是使用mq_notify使其在新消息可用时传递信号,从而使select调用返回-1errno设置为EINTR
  3. 公平排队,让第一个服务员收到下一个留言。对于POSIX消息队列,如果等待的线程在mq_receive中被阻塞,则可能是可能的。否则,下一个可用的消息将被传递到一个线程,该线程首先调用mq_receive

对于同一进程的线程之间的消息传递,另一种方法可以是让管道充当消息指针的队列。也就是说,生产者线程创建一个消息并将指向它的指针写入管道中(即不需要序列化整个消息,因为消息接收方处于相同的进程中,并且可以访问进程地址空间)。任何使用者线程都可以使用select在管道上等待,然后读取消息的指针。但是,如果多个线程正在同一个管道上等待,它们都会被唤醒,但只有一个线程会从管道中读取消息指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36821730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档