Moh*_*oun 7 c++ performance multithreading c++11 stdthread
我正在玩耍,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;
}
Run Code Online (Sandbox Code Playgroud)
在使用clang ++编译上面的代码而没有优化时,我得到了以下基准:
real 0m2.377s
user 0m4.688s
sys 0m0.005s
Run Code Online (Sandbox Code Playgroud)
然后我将代码更改为以下内容:(现在只使用1个线程)
#include <thread>
int k = 0;
int main() {
std::thread t1([]() { while (k < 1000000000) { k = k + 1; }});
t1.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这些是新的基准:
real 0m2.304s
user 0m2.298s
sys 0m0.003s
Run Code Online (Sandbox Code Playgroud)
为什么使用2个线程的代码比使用1的代码慢?
Mat*_*son 15
你有两个线程争夺同一个变量,k.因此,你花时间在处理器上说"处理器1:嘿,你知道它有什么价值k吗?处理器2:当然,你走了!",每隔几次更新来回拨打乒乓球.由于k不是原子的,所以也不能保证thread2不会写出"旧"值,k以便下次线程1读取该值时,它会跳回1,2,10 或100步,并且必须执行此操作再次 - 从理论上讲,这可能导致每个循环都没有完成,但这需要相当多的坏运气.