我正在撰寫一個需要可變數量執行緒的應用程式,我想在一個可以迭代的向量中創建它。應用程式始終跳過 for 回圈的第一次迭代,而是在回圈結束時執行意外操作。我不僅想解決這個問題,還想了解它的起源。
這是一個重新創建行為的玩具示例:
#include <iostream>
#include <mutex>
#include <thread>
#include <vector>
std::mutex my_mutex;
void print_func(int idx){
std::lock_guard<std::mutex> f(my_mutex);
std::cout << "Thread id: " << idx << std::endl;
}
int main() {
const auto processor_count = 4;
std::vector<std::thread> ThreadVector;
for(int i = 0; i < processor_count; i ){
ThreadVector.emplace_back([&](){print_func(i);});
}
for(auto& t: ThreadVector){
t.join();
}
return 0;
}
這是輸出:
Thread id: 1
Thread id: 2
Thread id: 3
Thread id: -214744752
這是預期的行為:
Thread id: 0
Thread id: 1
Thread id: 2
Thread id: 3
uj5u.com熱心網友回復:
你的拉姆達:
[&](){print_func(i);}
捕獲int i按參考,因此當執行緒啟動時,i不再是相同的值,并且對于最后一次迭代,i超出范圍,因此它具有來自堆疊的垃圾值。
按值而不是參考捕獲將解決您的問題:
[i](){print_func(i);}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/520378.html
標籤:C 多线程
