簡體   English   中英

std 線程構造函數是否采用可變參數線程 function?

[英]Does std thread constructor take variadic thread function?

我正在嘗試將可變計數的回調函數(所有相同的簽名)傳遞給線程 function。 我想出了以下代碼

using namespace std;

void callback(int i)
{
    cout<<"thread "<<i<<" running"<<endl;
}

template<typename ...CallbackType>
void threadProc(int id, CallbackType ...callbackPack)
{
    auto callbacks = {callbackPack...};
    for(auto callback : callbacks)
    {
        callback(id);
    }
}

int main()
{
    thread t(threadProc<void(int)>, 1, callback);
    t.join();
    return 0;
}

此代碼無法編譯

error: no matching function for call to ‘std::thread::thread(, int, void (&)(int))’
 thread t(threadProc<void(int)>, 1, callback);

如果threadProc()不使用任何參數包,一切都會正常工作。 是否有正確的方法來啟動帶有可變參數線程 function 的線程?

您的第一個參數是 function 指針,因此使用

thread t{threadProc<void(*)(int)>, 1, callback};

這里https://godbolt.org/z/Hzp9EP

您的代碼沒有任何問題。 這似乎只是GCC中的一個bug,與線程無關。 重現該錯誤的最小測試用例是:

template <typename... T>
void foo(T...) {}

int main()
{
    auto* pfoo = foo<void(int)>;

    return 0;
}

似乎 GCC 不喜歡foo具有void(int)類型的參數這一事實。 然而語言的規則很明確:這是允許的,並且當 function 類型作為參數類型出現時,它會調整為對應的 function 指針類型。

其他編譯器似乎沒有問題。 https://godbolt.org/z/tgaV7B

作為一種解決方法,您可以編寫:

thread t(threadProc<void(*)(int)>, 1, callback);

或者:

thread t(threadProc<decltype(&callback)>, 1, callback);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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