考慮下面的情況在新線程中訪問移動的std :: string
將名稱字符串作爲參數移動到線程。
void start(std::string&& name) {
t = std::thread{&ThreadRunner::run, this, std::forward<std::string>(name)};
}
該線程的運行函數也需要一個右值引用。
void run(std::string&& name) {
const auto errnum = pthread_setname_np(t.native_handle(), name.c_str());
if (errnum != 0) {
std::cout << "ERROR " << std::endl;
}
}
線程通過如下開始函數創建:
ThreadRunner r;
r.start(std::string("somename"));
的問題是。通過pthread_setname_np在函數run
中訪問的std :: string可能是垃圾的,因爲在範圍結束時臨時超出了範圍?
Demo 在上面的演示中,call
結束之後,它存在保證了somename
字符串是在功能run
有效?
編輯: Demo with constructors/destructors 的的std :: string的問題是現在有Wrap
更換打印所涉及的構造函數。
結果是:(第二字段是對象的地址,第三個是線程id)
Constructed 0x7ffc395e0ef0 140605000369984
Move Constructed 0x7ffc395e0e60 140605000369984
Move Constructed 0x177a0a0 140605000369984
Destroyed 0x7ffc395e0e60 140605000369984
Destroyed 0x7ffc395e0ef0 140605000369984
Call ended
somename
Destroyed 0x177a0a0 140604983461632
的最後一個對象,之後run
端部銷燬。它是否仍然指暫時的。我想不是。
編輯: 的意見後,這個問題歸結爲
「後,原來的呼叫爲void開始(的std :: string & &名);已經 返回後std :: thread的構造函數已結束,其中是 void run(std :: string & & name)的字符串;正在處理?「
最新的演示代碼似乎表明run
引用的對象Wrap
在run
退出後被破壞。
不要濫用'std :: forward'來處理它沒有提供的作業,請使用'std :: move'。 – Rakete1111
@ Rakete1111注意。謝謝。 – themagicalyang