【发布时间】:2018-12-27 20:39:20
【问题描述】:
在这段代码中,多线程正在降低性能:
unsigned long num1 = 0;
unsigned long num2 = 0;
thread myThread1(count1,&num1);
thread myThread2(count2, &num2);
myThread1.join();
myThread2.join();
cout << num1 << endl;
cout << num2 << endl;
void count1(unsigned long *num1){
long b = clock();
while( clock() - b < 1000)
{
(*num1)++;
}
}
void count2(unsigned long *num2){
long b = clock();
while( clock() - b < 1000)
{
(*num2)++;
}
}
最后 num1 = 690,000 和 num2 = 700,000(num1 和 num2 按此顺序)但是当我在单线程模式下运行时(当我评论第二个线程时)num = 1,600,000 所以多线程正在降低性能。为什么会这样?通过在 num1 和 num2(64 字节)之间添加一个填充,性能会变得更好,但仍然比单线程(num1,num2 = 750,000)更差
(当性能更好时,CPU 可以计数更多,但在第一部分它计数为 1,300,000,第二部分为 1,600,000)
(num1 和 num2 仅用于计数)
这是整个代码(已编辑)
【问题讨论】:
-
线程增加了一些不可忽视的开销。
-
您没有正确衡量“性能”,也没有正确定义它是什么。您希望您的代码做什么以及持续多长时间?用于比较的单线程代码列表在哪里。你用什么来分析它?为这两种情况提供 MCVE。我们没有精神力量来查看你在 count1 或 count2 中所做的事情
-
如果这是你的变量的声明,那么你有一个错误共享的坏情况(如果你正在做类似
while true ++*num的事情。) -
不能肯定,但这看起来确实是false sharing 的主要候选人。
-
count1和count2是做什么的?我会假设那些只是添加数字,但那些不会表明任何关于性能的东西。
标签: c++ multithreading