这是我班级的简要概述:
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库和线程组更优雅地完成,但是我试图保持这个项目无依赖性。
答案 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
超出范围并在线程仍在尝试时被删除使用它。这就是为什么你看到“尝试使用已删除的功能”