2017-07-23 71 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领域。

确保更改正在使用的编译器的设置,或将其设置为所有编译器。