我開始學習多執行緒編程,我有程式。多執行緒時我的程式速度較慢:多執行緒:~ 8.5 秒沒有多執行緒:~ 4.96 有人可以解釋我的代碼有什么問題嗎?
#include <iostream>
#include <thread>
#include <ctime>
using namespace std;
long long even_sum = 0;
long long odd_sum = 0;
void findEvenNumber(int start, int end){
for(int i=start;i<end;i ){
if(i%2==0){
even_sum ;
}
}
}
void findOddNumber(int start, int end){
for(int i=start;i<end;i ){
if(i%2==1){
odd_sum ;
}
}
}
void multiTask(){
thread t1(findEvenNumber,1,1000000000);
thread t2(findOddNumber,1,1000000000);
t1.join();
t2.join();
}
void noMultiTask(){
findEvenNumber(1,1000000000);
findOddNumber(1,1000000000);
}
int main(){
clock_t start = clock();
//noMultiTask();
//multiTask();
clock_t end = clock();
cout<<(double)(end - start)/CLOCKS_PER_SEC<<endl;
cout<<even_sum<<" "<<odd_sum<<endl;
return 0;
}
uj5u.com熱心網友回復:
至少,您有一個錯誤的共享問題。 even_count并且odd_count幾乎可以肯定在同一個快取行上,這意味著當您想要觸摸一個變數時,您實際上是在強制另一個執行緒使其快取行無效。虛假分享不止于此,但為了快速了解一下,Scott Meyers 的精彩演講一開始就談到了這一點:https ://www.youtube.com/watch?v=WDIkqP4JbkE
通過使用區域變數進行奇數/偶數計數并僅在執行緒末尾更新全域變數,我的系統性能得到了更好的提升(1.23299 秒與 1.07338 秒)。
void findEvenNumber(int start, int end){
auto count = 0;
for(int i=start;i<end;i ){
if(i%2==0){
count ;
}
}
even_sum = count;
}
void findOddNumber(int start, int end){
auto count = 0;
for(int i=start;i<end;i ){
if(i%2==1){
count ;
}
}
odd_sum = count;
uj5u.com熱心網友回復:
多執行緒版本必須啟動執行緒并等待它們完成。非多執行緒版本沒有。因此,多執行緒版本會占用更多 CPU 時間是有道理的。
多執行緒版本確實需要更少的掛墻時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/485005.html
