Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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+中模拟CPU负载+; 我目前正在用C++编写Windows应用程序,我想模拟CPU负载。_C++_Cpu_Cpu Usage - Fatal编程技术网

在C+中模拟CPU负载+; 我目前正在用C++编写Windows应用程序,我想模拟CPU负载。

在C+中模拟CPU负载+; 我目前正在用C++编写Windows应用程序,我想模拟CPU负载。,c++,cpu,cpu-usage,C++,Cpu,Cpu Usage,我有以下代码: void task1(void *param) { unsigned elapsed =0; unsigned t0; while(1){ if ((t0=clock())>=50+elapsed){//if time elapsed is 50ms elapsed=t0; Sleep(50); } } } int main(){ int ThreadNr; for(int i=0; i < 4;i+

我有以下代码:

void task1(void *param) { 

unsigned elapsed =0;
unsigned t0;

while(1){

    if ((t0=clock())>=50+elapsed){//if time elapsed is 50ms

        elapsed=t0;
        Sleep(50);
    }
  }
}

int main(){

int ThreadNr;

for(int i=0; i < 4;i++){//for each core (i.e. 4 cores)
    _beginthread( task1, 0, &ThreadNr );//create a new thread and run the "task1" function
}

while(1){}
}
void task1(void*param){
无符号经过=0;
未签名t0;
而(1){
如果((t0=clock())>=50+经过){//如果经过的时间是50ms
经过=t0;
睡眠(50);
}
}
}
int main(){
int-ThreadNr;
对于(int i=0;i<4;i++){//每个核(即4个核)
_beginthread(task1、0和&ThreadNr);//创建一个新线程并运行“task1”函数
}
而(1){}
}
我使用与本文中给出的答案相同的方法编写了此代码:

我的问题是:

我把C代码从另一个帖子正确翻译成C++?< /LI>
  • 这段代码会在四核处理器上产生50%的平均CPU负载吗
  • 如何在合理的精度范围内找出CPU的负载百分比?(任务管理器是我唯一的选择吗?)
  • 编辑:我问这个问题的原因是我希望最终能够在合理的公差范围内生成10、20、30、…、90%的CPU负载。对于生成70%以下的负载,此代码似乎工作得很好,但对于任何低于70%的负载(由任务管理器CPU负载读数测量),此代码似乎都非常不准确


    是否有人知道我如何生成上述负载,但仍然能够在不同的计算机上使用我的程序(即使用不同的CPU)?

    您可以使用Windows获得CPU负载。无论是对于整个系统还是对于整个进程,

    乍一看,这看起来都不漂亮,但正确的C++或C(一种简单的方法是编译它)。缺少include(

    ),但在其他方面它编译良好

    请注意,
    clock
    Sleep
    不是非常准确,而且
    Sleep
    也不是非常可靠。平均而言,线程函数应该按照预期的方式工作(给出或接受百分之几的变化)

    但是,关于问题2),您应该用阻塞而不是旋转的东西(例如
    WaitForSingleObject
    Sleep
    ,如果您愿意的话)替换最后一个
    ,而(1){}
    。否则,整个程序将在四核上有50%的负载。由于主线程的原因,一个内核将有100%的负载,加上四个工作线程的4倍50%。这显然会使每个内核的总开销超过50%(并且会导致线程从一个内核反弹到另一个内核,导致严重的副作用)

    使用任务管理器或类似的实用程序来验证是否获得了所需的负载是一个不错的选择(因为这是最简单的解决方案,也是最好的解决方案)

    还要注意的是,以这种方式模拟负载可能会有很多工作,但不是100%可靠。
    可能存在难以预测的影响(内存、执行单元)。例如,假设您在这个循环中使用100%的CPU整数执行单元(合理的假设),但它的浮点或SSE单元为零。现代CPU可能在真实或逻辑内核之间共享资源,您可能无法准确预测您得到的效果。或者,另一个线程可能内存不足或存在严重的页面错误,因此占用CPU时间不会像您想象的那样对其产生太大影响(实际上可能会给它足够的时间使预取工作更好)。或者,它可能会阻止AGP传输。或者,你说不出的其他事情

    编辑:

    改进的版本,更短的代码,修复了一些问题,也可以按预期工作:

    • 使用
      clock\t
      作为
      clock
      返回的值(从技术上讲,这是“更正确的”而不是使用非特定的
      typedef
      'd整数。顺便说一句,这可能就是原始代码不能按预期工作的原因,因为在Win32下
      clock\t
      是一个有符号整数。
      if()中的条件
      总是计算
      true
      ,因此工作人员几乎一直在睡觉,不消耗CPU
    • 代码越少,旋转时的数学就越简单。在未来计算50次唤醒时间,并旋转直到达到该时间
    • 使用
      getchar
      在结束时阻止程序。这不会消耗CPU时间,并且允许您通过按Enter键结束程序。线程不会像通常那样正确结束,但在这种简单的情况下,在进程退出时让操作系统终止线程可能没问题
    • <> LI>与原始代码一样,假设时钟< /C>和 Suth使用相同的TIKE。这是一个大胆的假设,但它在Win32中是真实的,在原始代码中使用(两个“TICK”都是毫秒)。C++没有任何类似<代码>睡眠< /代码>的代码。(没有
      boost::thread
      ,或者C++11
      std::thread
      ),因此,如果要实现非Windows可移植性,无论如何都必须重新考虑
    • 与原始代码一样,它依赖于函数(
      clock
      Sleep
      ),这些函数不精确且不可靠。
      Sleep(50)
      在我的系统上等于
      Sleep(63)
      ,而不使用
      timeBeginPeriod
      。然而,该程序工作“几乎完美”,导致我的机器上有50%+/-0.5%的负载
    • 与原始代码一样,这不考虑线程优先级。具有高于正常优先级类的进程将完全不受此限制代码的影响

      #包括
      #包括
      #包括
      #包括
      作废任务1(作废*)
      {
      而(1)
      {
      时钟唤醒=时钟()+50;
      while(clock()

      • 这是一个代码示例,它在Windows上将我的CPU加载到100%

        #include "windows.h"
        
        DWORD WINAPI thread_function(void* data)
        {
            float number = 1.5;
            while(true)
            {
                number*=number;
            }
            return 0;
        }
        
        void main()
        {
            while (true)
            {
                CreateThread(NULL, 0, &thread_function, NULL, 0, NULL);
            }
        }
        
        当您构建应用程序和
        #include "windows.h"
        
        DWORD WINAPI thread_function(void* data)
        {
            float number = 1.5;
            while(true)
            {
                number*=number;
            }
            return 0;
        }
        
        void main()
        {
            while (true)
            {
                CreateThread(NULL, 0, &thread_function, NULL, 0, NULL);
            }
        }