1. 程式人生 > 其它 >C++ 多執行緒的錯誤和如何避免(3)

C++ 多執行緒的錯誤和如何避免(3)

傳遞給 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 就試圖改變引數值,在編譯期間就會報錯,這也算是一個好的提醒吧