[英]Is it safe to pass arguments by reference into a std::thread function?
[英]Pass multiple arguments into std::thread
我問的是 C++11 標准中的<thread>
庫。
假設你有一個類似的功能:
void func1(int a, int b, ObjA c, ObjB d){
//blahblah implementation
}
int main(int argc, char* argv[]){
std::thread(func1, /*what do do here??*/);
}
您如何將所有這些參數傳遞到線程中? 我嘗試列出如下參數:
std::thread(func1, a,b,c,d);
但它抱怨沒有這樣的構造函數。 解決這個問題的一種方法是定義一個結構來打包參數,但還有另一種方法可以做到這一點嗎?
您實際上只是將它們傳遞給std::thread(func1,a,b,c,d);
如果對象存在,它應該已經編譯,但由於另一個原因它是錯誤的。 由於沒有創建對象,您無法加入或分離線程,程序將無法正常工作。 由於它是臨時的,因此立即調用析構函數,因為線程尚未加入或分離,但std::terminate
被調用。 您可以在臨時銷毀之前std::join
或std::detach
它,例如std::thread(func1,a,b,c,d).join();//or detach
。
這是應該如何做的。
std::thread t(func1,a,b,c,d);
t.join();
如果您不知道加入和分離之間的區別,您也可以分離線程,閱讀線程。
有同樣的問題。 我正在傳遞自定義類的非常量引用,並且構造函數抱怨(一些元組模板錯誤)。 用指針替換了引用並且它起作用了。
這個問題可以通過創建一個可以保存函數參數的類來解決。
創建一個此類的對象,並帶有要傳遞的參數。
然后將此對象傳遞給線程。
功能也應相應修改。
如果你得到這個,你可能忘記把#include <thread>
放在文件的開頭。 OP 的簽名似乎應該可以工作。
在 Mac 上我試過這個並且它有效:
#include <iostream>
#include <thread>
using namespace std;
string t1(int firstInput, int secondInput){
cout << firstInput << " ,";
cout << secondInput << " ,";
return "finish thread t1";
}
int main()
{
int userInput1;
int userInput2;
cout << "Set a number" << endl;
cin >> userInput1;
cout << "Set second number"<< endl;
cin >> userInput2;
thread ThreadT1(t1, userInput1, userInput2 );
ThreadT1.join();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.