Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不同工艺之间的产量 我有两个C++代码,一个叫做A,一个叫做B。我正在64位Linux中运行,使用Boost线程库_Linux_Multithreading_Boost_G++_Yield - Fatal编程技术网

不同工艺之间的产量 我有两个C++代码,一个叫做A,一个叫做B。我正在64位Linux中运行,使用Boost线程库

不同工艺之间的产量 我有两个C++代码,一个叫做A,一个叫做B。我正在64位Linux中运行,使用Boost线程库,linux,multithreading,boost,g++,yield,Linux,Multithreading,Boost,G++,Yield,a代码创建了5个线程,这些线程停留在一个非结束循环中,执行一些操作。 b代码创建了5个线程,它们位于调用yield()的非结束循环中 我在一台四核机器上。。。当一个用户单独调用一个代码时,它获得了几乎400%的CPU使用率。当a单独调用b代码时,它获得了几乎400%的CPU使用率。我早就料到了 但是当两者同时运行时,我期望b代码几乎不使用CPU,a使用400%。但实际上两者都使用了相当于CPU的一部分,几乎是200% 我的问题是,yield()不是在不同的进程之间工作吗?有没有办法让它按我预期的

a代码创建了5个线程,这些线程停留在一个非结束循环中,执行一些操作。 b代码创建了5个线程,它们位于调用yield()的非结束循环中

我在一台四核机器上。。。当一个用户单独调用一个代码时,它获得了几乎400%的CPU使用率。当a单独调用b代码时,它获得了几乎400%的CPU使用率。我早就料到了

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


我的问题是,yield()不是在不同的进程之间工作吗?有没有办法让它按我预期的方式工作?

因此,您有4个内核运行属于a的4个线程。队列中有6个线程-1 a和5 B。运行a线程的其中一个线程耗尽其时间片并返回队列。调度程序从队列中选择下一个可运行线程。该胎面属于B的概率是多少?5/6. 好的,这个线程启动后,它调用sched_yield()并返回队列。下一个线程再次成为B线程的概率是多少?又是5/6

进程B一次又一次地获取CPU,并迫使内核进行昂贵的上下文切换


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

Linux使用动态线程优先级。使用nice设置的静态优先级只是为了限制动态优先级

当线程使用其整个时间片时,内核将降低其优先级;当线程不使用其整个时间片时(通过执行IO、调用wait/yield等),内核将提高其优先级


所以我猜进程b线程的优先级更高,因此它们执行的频率更高。

我没有答案,我认为你的问题很有趣,因为sched_声明将进程放在运行队列的后面,但这可能会让您对使用sched_yield的实际用途产生疑问,这可能会让您感兴趣:这本书的片段暗示了linux内核的版本很重要:这是意料之中的。那是因为。