CPU占用率显示为100%

时间:2015-08-26 07:15:54

标签: c linux multithreading cpu

我有一个读/写器来自/来自公共缓冲区的场景。所有编写器线程的优先级都高于读者线程。如果缓冲区中有任何数据读取所有内容并调用sche_yield()函数,则读取器线程激活函数处于连续循环中。

在这种情况下,我预计CPU利用率在20%到30%之间,但它显示为100%(Linux顶级命令),但经过一点点挖掘后,我意识到阅读器线程在读完数据后会在最后添加调度队列并没有写入数据的编写器,读取器再次调度,它再次产生并在调度队列结束时添加,这是连续重复,由于这个CPU显示100%。

我觉得应该有一个处理meachanism的事件,而不是while循环中的读者继续查询数据。你能帮助如何编写事件处理(当编写器线程写入数据时应该有读者线程的指示),这是平台和操作系统无关的吗?

由于

1 个答案:

答案 0 :(得分:2)

通常,您应该使用一个同步原语,该原语允许读者线程等到工作实际出现,而不是执行繁忙的循环。这可以通过称为条件变量的同步原语来解决。

如果C是唯一的选项,您可以使用C11 thread support library引入的cnd_t条件变量,但旧编译器不支持此变量。在这种情况下,您仍然拥有pthread_cond_t所有同步功能,例如pthread_cond_wait / pthread_cond_signal,但我不知道Windows功能是否在Microsoft Windows服务中调用了#34; Pthread支持UNIX版本3.5"在Windows上支持POSIX线程的东西不被认为是遗留的。但是,您应该能够围绕模仿POSIX条件变量行为的Windows HANDLE对象创建一个瘦包装。

如果您可以使用C ++,那么您可以使用C ++ 11引入的std::condition_variable

关于支持C11的说明

由于您提到您需要独立于平台的机制,因此应该注意MSVC 2012(我至少可以验证自己)不支持C11,而关于MSVC 2015的链接(例如this)大多暗示它是那里也不支持。