【发布时间】:2010-10-11 18:12:40
【问题描述】:
我有一个工作线程,它从程序开始就处于活动状态,并且会始终如一地从队列中获取对象进行处理。我想知道阻止线程的最佳方法是什么?大约每几十微秒(在 10 - 100 微秒之间),对象将被推入队列。我应该将线程设置为定期休眠还是应该在线程之间制定一些信号机制?我想主要关注性能问题。有什么想法吗?
谢谢。
【问题讨论】:
我有一个工作线程,它从程序开始就处于活动状态,并且会始终如一地从队列中获取对象进行处理。我想知道阻止线程的最佳方法是什么?大约每几十微秒(在 10 - 100 微秒之间),对象将被推入队列。我应该将线程设置为定期休眠还是应该在线程之间制定一些信号机制?我想主要关注性能问题。有什么想法吗?
谢谢。
【问题讨论】:
另一方面,您可以使用 条件变量,只要它是 pthread 的通用特性。条件变量是基于 pthread 互斥体设计的,因此它们是非常有效的同步原语(当然取决于实际平台)。
关注them。
【讨论】:
Posix message queues 看起来是个不错的候选者,如果您的数据不是太大的话。 你也可以使用POSIX semaphore:
生产者线程将数据放入队列,并执行 sem_post
消费者线程使用 sem_wait 等待,并从队列中移除数据。
使用 IMO 比使用条件变量更容易。当然,您需要保护您的队列。根据对象的大小,它可能比消息队列更适合,但您需要实现自己的队列。
两者都可以在进程而不是线程之间使用。如果您决定使用进程而不是线程,则可以保留同步机制,而条件变量则不是这样。
【讨论】:
在阻塞模式下使用POSIX消息队列(mq_open等),真的很简单,看看是否满足你的性能要求。如果没有,请再问一个问题:)
【讨论】: