簡體   English   中英

for循環中的C ++ 11線程類成員函數給出分段錯誤

[英]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].secondcoord[i].first作為參數給線程函數(或可能是一個恆定參考coord[i]並具有螺紋功能創建其自己的LogOdd對象。

我相信問題出在LogOdd CEB 您在塊內靜態分配它,因此它在塊的末尾被銷毀,塊的末尾在創建它的迭代末尾。

然后,您將使用一個指向不再存在的對象的指針,這最終導致未定義的行為。 最簡單的解決方案是使用new動態分配它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM