不同过程之间的收益

时间:2011-09-22 22:48:24

标签: linux multithreading boost g++ yield

我有两个C ++代码,一个名为 a ,一个名为 b 。我使用Boost线程库在64位Linux中运行。

a 代码创建5个线程,这些线程保持在非结束循环中执行某些操作。 b 代码创建5个线程,这些线程保持在一个非结束循环中,调用yield()。

我在四核机器上......当单独调用 a 代码时,它几乎占用了400%的CPU使用率。当单独调用 b 代码时,它几乎可以获得400%的CPU使用率。我已经预料到了。

但是当两者同时运行时,我希望 b 代码几乎不使用CPU, a 使用400%。但实际上两者都使用了相当于CPU的切片,几乎是200%。

我的问题是,不会产生()在不同的过程之间起作用吗?有没有办法让它按照我的预期运作?

2 个答案:

答案 0 :(得分:3)

所以你有4个核心运行4个属于A的线程。队列中有6个线程 - 1个A和5个B.运行A线程之一耗尽其时间片并返回队列。调度程序从队列中选择下一个可运行的线程。这个胎面属于B的概率是多少? 5/6。好的,这个线程启动了,它调用sched_yield()并返回队列。下一个线程再次成为B线程的概率是多少? 5/6再次!

进程B一次又一次地获取CPU时间,并且还强制内核执行昂贵的上下文切换。

sched_yield适用于一种特殊情况 - 当一个线程使另一个线程可运行时(例如,解锁互斥锁)。如果你想让B等待A正在处理重要的事情 - 使用一些同步机制可以让B进入睡眠状态直到A唤醒它

答案 1 :(得分:2)

Linux使用动态线程优先级。您使用nice设置的静态优先级仅用于限制动态优先级。

当一个线程使用他的整个时间片时,内核将降低它的优先级,当线程不使用他的整个时间片时(通过执行IO,调用wait / yield等),内核将增加它的优先级。

所以我的猜测是进程 b 线程具有更高的优先级,因此它们执行得更频繁。

相关问题