C++ for 循环中的 11 个线程类成员函数会给出分段错误



我将 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].secondcoord[i].first作为参数传递给线程函数(或者可能是对coord[i]的常量引用),并让线程函数创建自己的LogOdd对象。

我相信

问题出在LogOdd CEB.你在块内静态分配它,所以它在块的末尾被销毁,也就是在创建它的迭代结束时。

然后,您将使用指向不再存在的对象的指针,这最终成为未定义的行为。最简单的解决方案是使用new动态分配它。

相关内容

  • 没有找到相关文章