尝试从类中启动成员函数的线程

时间:2015-10-16 16:58:43

标签: c++ multithreading

这是我班级的简要概述:

class foo{
public:
    vector<string> rawData;
    vector<vector<string> > slicedData;
    void readData();
    void sortData();
private:
    static void selectionSort(vector<string>);
};

基本上,readData使用外部文件中的信息填充rawData。执行此操作后,sortData会将该数据拆分为子集,每个子​​集都存储在slicedData中。我需要生成一个selectionSort的线程来对每个子集进行排序,我必须在sortData内部这样做。

我在sortData内以这种方式尝试过:

thread *threads = new thread[slicedData.size()];

for(int i = 0; i < slicedData.size(); i++){
    threads[i] = thread(selectionSort,slicedData[i]);
}

...但是当我这样做时,g ++会抛出error: attempt to use a deleted function

对于记录,我需要将线程存储在一个数组中,以便稍后加入它们。我意识到这可以通过boost库和线程组更优雅地完成,但是我试图保持这个项目无依赖性。

2 个答案:

答案 0 :(得分:4)

我无法重现您的错误,但以下代码会为我编译。

我建议使用线程 vector 并调用 \ templace_back()来创建线程 矢量 ..

这样的事情:

class foo
{
public:
    std::vector<std::vector<std::string> > slicedData;

    void sortData()
    {
        std::vector<std::thread> threads;

        // for each slice add a new thread passing the function and data
        // to its constructor
        for(auto& slice: slicedData)
            threads.emplace_back(&foo::selectionSort, std::ref(slice));
            // NOTE: use of std::ref() to pass by reference

        // now join the threads to prevent the threads vector
        // going out of scope before they finish
        for(auto&& thread: threads)
            thread.join();

    }

private:
    static void selectionSort(std::vector<std::string>&); // pass by reference
};

另请注意,我通过引用传递数据,因为我怀疑您并不真的想要对数据副本进行排序。

答案 1 :(得分:0)

错误不在此处显示的线程代码中。可能,您的sortData方法不等待线程完成(使用thread.join,如Galik所述),并且您的foo超出范围并在线程仍在尝试时被删除使用它。这就是为什么你看到“尝试使用已删除的功能”