我正在嘗試并行化 Parser 類中的方法。由于這種方法需要共享互斥體,我無法使用 OpenMP,因此必須使用標準庫。
我目前正在使用 C 17,這是不起作用的主要代碼:
auto p = Parser(.7);
int tMax = thread::hardware_concurrency();
vector<thread> threads;
int chunk = (int)lines.size() / tMax;
for (int i = 0; i < tMax; i) {
int start = chunk * i;
threads.emplace_back(&Parser::parse, &p,lines, start, i);
}
問題是我在創建一個新執行緒時得到了一個 SIGABRT,我不知道這是什么原因。
你可以在這里找到完整/混亂的代碼。如果您想深入了解它,我將簡要列出重要的行:
- 32-110:輔助物件定義
- 112:決議器定義開始
- 335:決議方法定義
- 424:主要(參考代碼 443)
我尋找了與我類似的案例(比如這個),但我仍然不明白到底發生了什么以及為什么。
除錯只會將我帶到執行緒建構式和匯編代碼,直到它到達終止例外拋出器。
我想我可能會弄亂地址和參考,因為我正在傳遞物件本身,但我沒有足夠的 C 經驗來確定。
我還應該提到,在主執行緒中呼叫此函式時可以完美運行,但是在創建第二個執行緒時,它似乎會拋出 SIGABRT。
編輯:
最小/清潔示例可以在這里找到。
uj5u.com熱心網友回復:
您正在創建一個vector執行緒,然后立即退出main而不等待它們中的任何一個完成執行。這將導致它們崩潰。
添加for(auto& t : threads) t.join();到 main 的末尾以等待所有執行緒在我的測驗中有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/529409.html
標籤:C 多线程解析
上一篇:Java執行緒擺動
