作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 Linux 上使用 pthread。我有一个循环缓冲区,用于将数据从一个线程传递到另一个线程。也许循环缓冲区不是这里使用的最佳结构,但改变它不会让我的问题消失,所以我们将它称为队列。
每当我的队列已满或为空时,弹出/推送操作返回 NULL。这是有问题的,因为我的线程会定期触发。等待另一个线程循环会花费太长时间。
我试过使用信号量(sem_post、sem_wait),但在争用下解锁最多需要 25 毫秒,这大约是我的循环速度。我试过使用 pthread_cond_t 等待,但解锁需要 10 到 15 毫秒。
我可以使用更快的机制来等待数据吗?
编辑*
好的,我使用了条件变量。我在嵌入式设备上,所以添加“更多内核或 CPU 功率”不是一种选择。这让我意识到我在各处都设置了各种线程优先级,所以我会在继续之前解决这个问题
最佳答案
您应该使用条件变量。唯一更快的方法是特定于平台的,而且它们的速度可以忽略不计。
您看到您认为性能不佳的原因仅仅是因为您的线程被取消了调度。当您的线程接近其时间片的末尾并且调度程序允许未阻塞的线程抢占正在运行的线程时,您会看到很长的“延迟”。如果内核多于线程或将线程设置为更高的优先级,则不会看到这些延迟。
但这些延迟实际上是一件好事,您不应该担心它们。其他线程也有机会运行。
关于c++ - 在线程争用下等待的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8947809/
我是一名优秀的程序员,十分优秀!