我将 8 个数据集成对存储在一个向量中,并决定一个接一个地传递到一个类中,并在该类中使用函数执行一些工作。 生成分段错误。这是我的代码:
vector<thread> threads;
for (int i = 0; i < 8; i++) { // generate 8 threads
LogOdd CEB; // create LogOdd obj
CEB.set_data(coord[i].second, coord[i].first); // pass parameters to private members
threads.push_back(thread(&LogOdd::scan, &CEB));
for (int i = 0; i < 8; i++){
threads[i].join();
}
该类如下所示:
class LogOdd {
private:
string sequence;
string chromosome;
public:
void scan() { // function to be threaded
...
}
void set_data(string SEQUENCE, string CHROMOSOME) { // set parameters
sequence = SEQUENCE;
chromosome = CHROMOSOME;
}
};
我很确定在第一个线程循环中生成的分段错误,但不知道......我知道这个主题可能是重复的,但我已经做了很多搜索。请帮忙!
更新感谢您回答我的问题。我以两种方式编辑了我的代码,它们有效!
vector<thread> threads;
for (int i = 0; i < 8; i++) { // generate 8 threads
LogOdd * CEB = new LogOdd; // create LogOdd obj
CEB->sequence = coord[i].second;
CEB->chromosome = coord[i].first;
threads.push_back(thread(&LogOdd::scan, CEB));
}
我做的另一种方法是先将所有 8 个 obj 存储到一个向量中,然后分配给线程:
vector<thread> threads;
vector<LogOdd> LogOddvec;
for (int i = 0; i < 8; i++) {
LogOdd CEB;
CEB.sequence = coord[i].second;
CEB.chromosome = coord[i].first;
LogOddvec.push_back(CEB);
}
for (int i = 0; i < 8; i++) {
threads.push_back(thread(&LogOdd::scandinuc, &LogOddvec[i]));
}
让我们看一下这些行:
for (int i = 0; i < 8; i++) { // generate 8 threads
LogOdd CEB; // create LogOdd obj
...
threads.push_back(thread(&LogOdd::scan, &CEB));
...
}
在循环中定义变量CEB
。将指向此变量的指针传递给线程。然后循环迭代,CEB
超出范围并被破坏。
这意味着线程将传递指向已销毁对象的指针。在线程中取消引用该指针将导致未定义的行为,这是像您这样的崩溃的常见原因。
最简单的解决方案是使用 new
动态分配LogOdd
对象。一个可能更好的解决方案是按值传递CEB
线程函数。另一种解决方案是将coord[i].second
和coord[i].first
作为参数传递给线程函数(或者可能是对coord[i]
的常量引用),并让线程函数创建自己的LogOdd
对象。
问题出在LogOdd CEB
.你在块内静态分配它,所以它在块的末尾被销毁,也就是在创建它的迭代结束时。
然后,您将使用指向不再存在的对象的指针,这最终成为未定义的行为。最简单的解决方案是使用new
动态分配它。