2017-07-23 81 views
-1

我正在使用Eclipse Neon並嘗試創建一個併發計數器的基本示例,該計數器遞增和遞減20,但構建不會編譯。我的代碼兩行被突出顯示並且兩者都示出了以下錯誤:C++錯誤:'operator ='是'std :: __ 1 :: thread'的私有成員

「運算符=」是「的std :: __ 1 ::螺紋」

所討論的行是的私有成員:

upThreads[i] = std::thread(increment20); 
downThreads[i] = std::thread(decrement20); 

的完整代碼:

#include <thread> 
#include <iostream> 
#include <mutex> 

using namespace std; 

std::mutex mymutex; 
int counter; 

void increment20() { 
    std::lock_guard<std::mutex> guard(mymutex); 
    for (int i = 0; i < 20; i++) { 
     ++counter; 
    } 
} 

void decrement20() { 
    std::lock_guard<std::mutex> guard(mymutex); 
    for (int i = 0; i < 20; i++) { 
     --counter; 
    } 
} 

int main() { 

    std::thread upThreads[10]; 
    std::thread downThreads[10]; 

    for (int i = 0; i < 10; ++i) { 
     upThreads[i] = std::thread(increment20); 
     downThreads[i] = std::thread(decrement20); 
    } 

    for (int i = 0; i < 10; ++i) { 
     upThreads[i].join(); 
     downThreads[i].join(); 
    } 

    std::cout << "final value: " << counter << std::endl; 

    return 0; 
} 

任何幫助將不勝感激!

+0

這些行應該沒有問題,因爲它們應該使用移動賦值運算符而不是複製賦值運算符。你使用什麼編譯器和版本? –

+0

@NeilButterworth:他們是可移動的。 –

+0

如上所述,您的問題[不可重現](http://coliru.stacked-crooked.com/a/eda4427c05800cc6)。你正在使用哪個編譯器選項? – Rakete1111

回答

0

答案發現是Eclipse中的C++版本設置。右鍵單擊該項目,並按照通過設置這個路徑:

屬性 - > C/C++編譯 - >設置 - >工具設置 - > GCC C++編譯器 - >方言

然後在語言標準選擇ISO C11領域。

確保更改正在使用的編譯器的設置,或將其設置爲所有編譯器。