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

Trying to start threads of a member function from within a class

本文关键字:成员 函数 线程 启动      更新时间:2023-10-16

这是我的类的快速大纲:

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库和线程组更优雅地完成,但我试图保持这个项目的无依赖性。

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

我建议使用线程的向量并调用emplace_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
};

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

错误不在您在这里展示的线程代码中。可能,您的sortData方法没有等待线程完成(使用Galik所描述的thread.join),并且您的foo超出了范围并在线程仍试图使用它时被删除。这就是为什么你会看到"attempt to use a deleted function"