C++ 多執行緒的錯誤和如何避免(3)
阿新 • • 發佈:2022-05-16
傳遞給 C++ 執行緒的建構函式的引數是通過值傳遞的
VS 平臺:2019
問題:如何線上程中改變傳遞的引數值?
比如:
#include <functional> #include <iostream> #include <string> #include <thread> void ChangeCurrentMissileTarget(std::string& targetCity) { targetCity = "Metropolis"; std::cout << " Changing The Target City To " << targetCity << std::endl; } int main() { std::string targetCity = "Star City"; std::thread t1(ChangeCurrentMissileTarget, targetCity); t1.join(); std::cout << "Current Target City is " << targetCity << std::endl; return 0; }
編譯會報錯,如下:
結論:如果線上程中試圖改變引數的值,需要新增 std::ref()
std::thread t1(ChangeCurrentMissileTarget, std::ref(targetCity));
改變之後的除錯結果:
當然,不新增 std::ref 就試圖改變引數值,在編譯期間就會報錯,這也算是一個好的提醒吧