gpt4 book ai didi

c++ - 为什么在 C++ 中使用多线程时运行时间没有减半?

转载 作者:行者123 更新时间:2023-11-30 01:49:33 24 4
gpt4 key购买 nike

现在,当代码在多线程中运行时以及当我在线程中注释 for 循环(每个 FOR 循环运行 10000 次)并且只运行整个 FOR 循环(20000 次)时,代码需要 866678 个时钟滴答。有线程和无线程的运行时间相同。但理想情况下,它应该只对了一半?

// thread example
#include <iostream> // std::cout
#include <thread> // std::thread
#include <time.h>
#include<cmath>
#include<unistd.h>
int K = 20000;
long int a[20000];

void makeArray(){
for(int i=0;i<K;i++){
a[i] = i;
}
}

void foo()
{
// do stuff...
std::cout << "FOOOO Running...\n";
for(int i=K/2;i<K;i++){
// a[i] = a[i]*a[i]*10;
// a[i] = exp(2/5);
int j = i*i;
usleep(2000);
}
}

void bar(int x)
{
// do stuff...
std::cout << "BARRRR Running...\n";

for(int i=0;i<K/2;i++){
//a[i] = a[i]*a[i];
int j = i*i;
usleep(2000);
}
}

void show(){

std::cout<<"The array is:"<<"\n";
for(int i=0; i <K;i++){
std::cout<<a[i]<<"\n";
}
}

int main()
{
clock_t t1,t2;
t1 = clock();
makeArray();
// show();

std::thread first (foo); // spawn new thread that calls foo()
std::thread second (bar,0); // spawn new thread that calls bar(0)
//show();

std::cout << "main, foo and bar now execute concurrently...\n";

// synchronize threads:
first.join(); // pauses until first finishes
second.join(); // pauses until second finishes
//show();
// for(int i=0;i<K;i++){
// int j = i*i;
// //a[i] = a[i]*a[i];
// usleep(2000);
// }


std::cout << "foo and bar completed.\n";
//show();
t2 = clock();
std::cout<<"Runtime:"<< (float)t2-(float)t1<<"\n";
return 0;
}

最佳答案

问题出在您对 clock() 的使用上。该函数实际上会返回您的程序在所有内核/CPU 上消耗的 CPU 运行时间总量。

您真正感兴趣的是您的程序完成所花费的挂钟时间。

将 clock() 替换为 time()、gettimeofday() 或类似的东西以获得您想要的。

编辑 - 这是按您想要的方式执行计时器的 C++ 方法:http://www.cplusplus.com/reference/chrono/high_resolution_clock/now/

关于c++ - 为什么在 C++ 中使用多线程时运行时间没有减半?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28922728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com