【发布时间】:2020-07-27 20:36:30
【问题描述】:
我是 C++ 多线程编程的新手。我写了一段简单的代码,我将在下面粘贴。 当在两个线程中运行时,代码完成的速度几乎不比在单线程中运行时快。我遇到过其他类似的问题,但是它们不同,因为我没有两个线程都需要访问的共享资源:
代码如下:
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
using namespace std;
typedef unsigned long long ull;
ull oddSum = 0;
ull evenSum = 0;
void addOdd(){
for(int i = 1; i <= 1999999999; i++){
if(i % 2 == 1)
oddSum += i;
}
}
void addEven(){
for(int i = 1; i <= 1999999999; i++){
if(i % 2 == 0)
evenSum += i;
}
}
int main(){
auto startTime = std::chrono::high_resolution_clock::now();
//Two threads
std::thread t1(addEven); //launch the two threads to run
std::thread t2(addOdd);
t1.join();
t2.join(); //wait for both to finish
//One thread
//addEven();
//addOdd();
auto stopTime = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(stopTime - startTime);
cout << "Odd Sum: " << oddSum << endl;
cout << "Even Sum: " << evenSum << endl;
cout << elapsed.count()/(double)1000000 << endl;
return 0;
}
当我使用单线程运行时,平均运行 10 次约为 7.3 秒。
当我使用 两个线程 运行时,平均运行 10 次约为 6.8 秒。
由于函数中的循环占用了绝大多数时间,我相信并行运行两个线程,每个线程都有一个函数,运行时间会减半。
注意 1:我知道时间不可能正确减半,更有根据的猜测可能是两个线程中最多 5 秒的运行时间。我了解线程对象的创建有其自身的开销。
注意 2:也许我遗漏了一些东西,但是线程没有访问两者之间的任何共享位置。
欢迎任何想法。我熟悉并发编程背后的理论,我现在才刚刚开始获得一些实践经验。我有一个 4 核的英特尔 i7。
【问题讨论】:
-
oddSum/evenSum 是否在同一缓存行上?它们应该相隔 64 字节
-
您记得启用优化吗?
-
@mikelRychliski 成功了,谢谢。将对此进行更多阅读。
-
你使用的是什么 CPU 和编译器?
标签: c++ multithreading performance