[英]C++ 11 thread class member function in for loop gives segmentation fault
我將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;
}
};
我很確定在第一個線程for循環中生成的分段錯誤,但是不知道...我知道這個主題可能是重復的,但是我已經做了很多搜索。 請幫忙!
更新感謝您回答我的問題。 我用兩種方法編輯了代碼,它們起作用了!
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
動態分配它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.