簡體   English   中英

將多個參數傳遞給 std::thread

[英]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::joinstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM