gpt4 book ai didi

c++ - 2个线程比1个慢?

转载 作者:可可西里 更新时间:2023-11-01 18:06:40 26 4
gpt4 key购买 nike

我在玩 std::thread 时突然出现了一些奇怪的东西:

#include <thread>

int k = 0;

int main() {
std::thread t1([]() { while (k < 1000000000) { k = k + 1; }});
std::thread t2([]() { while (k < 1000000000) { k = k + 1; }});

t1.join();
t2.join();

return 0;
}

当使用 clang++ 编译上述代码时没有优化,我得到了以下基准:

real 0m2.377s  
user 0m4.688s
sys 0m0.005s

然后我将代码更改为以下内容:(现在仅使用 1 个线程)

#include <thread>

int k = 0;

int main() {
std::thread t1([]() { while (k < 1000000000) { k = k + 1; }});

t1.join();

return 0;
}

这些是新的基准:

real 0m2.304s
user 0m2.298s
sys 0m0.003s

为什么使用 2 个线程的代码比使用 1 个线程的代码慢?

最佳答案

您有两个线程争夺同一个变量,k。所以你花时间在处理器说“处理器 1:嘿,你知道 k 有什么值(value)吗?处理器 2:当然,给你!”,每隔几次更新就来回乒乓.由于 k 不是原子的,因此也不能保证线程 2 不会写入 k 的“旧”值,以便下次线程 1 读取该值时,它会跳转后退 1、2、10 或 100 步,并且必须重新做一遍 - 理论上,每次完成都不会导致任何循环,但这需要相当多的运气。

关于c++ - 2个线程比1个慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17137115/

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