2

我对std::thread类的 Visual Studio 2012 实现有疑问。

Error C2248: "std::thread::thread": cannot access private member declared in class std::thread
    c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0 line: 606

A.hpp:

class A{ 
    public:
        A();
        ~A();


    private:
        vector<thread> listOfThreads;       
        int numberOfProcessorCores;
        int startUpWorkerThreads();
};

A.cpp:

    int A::startUpWorkerThreads(){
        if(numberOfProcessorCores <= 0) return 2; //Keine Angabe zur Anzahl der Prozessorkerne
        if(listOfThreads.size() > 0) return 3; //Bereits initialisiertdefiniert

        for(int i = 0; i < numberOfProcessorCores; i ++){
            thread newThread(&TaskManagement::TaskManager::queueWorker);            
            listOfThreads.push_back(newThread);
        }

        return 0;
    }

这是我的程序中使用线程类的部分。

有谁知道为什么会发生这个错误?

4

2 回答 2

3

该错误告诉您一个操作正在尝试调用std::thread的复制构造函数或赋值运算符,这两者都是已删除或私有的。作为替代方案,您可以通过推送这样的临时变量将线程“移动”到向量中:

listOfThreads.push_back(thread(&TaskManagement::TaskManager::queueWorker));

否则,您可以调用std::move您的线程对象,这会使您的线程对象处于与默认构造的对象相同的状态(感谢@JonathanWakely 在评论中指出这一点)。在您的情况下,没有理由创建线程并显式移动它。

于 2012-11-11T21:00:08.330 回答
0

std::thread没有复制构造函数,它需要执行push_back,并且可能用于其他vector操作。

于 2012-11-11T20:55:32.373 回答