std::thread 在按引用傳遞時呼叫複製建構子
使用std::thread 將資料傳遞到執行緒可能會出現問題,尤其是在處理禁用複製建構函數的類別時。此行為源自於 std::thread 按值取得其參數的事實。
考慮以下帶有禁用複製建構函數的Log 類別:
在main 函數中,Log物件記錄器透過引用傳遞給伺服器函數:
伺服器函數然後建立一個新線程,其中記錄器作為argument:
但是,由於Log 中停用了複製建構函數,這會導致編譯器錯誤。
為什麼會依照引用傳遞會呼叫複製建構子?
與常見的假設相反,在 C 中按引用傳遞不會阻止複製構造函數的呼叫。傳遞參考時,編譯器會建立所引用物件的臨時副本並將其傳遞給函數。這是因為 std::thread 期望其參數是可複製的。
解決方案:使用std::reference_wrapper
要在這個情況下實作引用語義,您可以使用std::reference_wrapper:
std::ref 以某種方式包裝引用,使得它顯示為std::thread 的可複製物件。但是,您必須確保底層物件(在本例中為記錄器)的生命週期超出執行緒的生命週期。
以上是為什麼 std::thread 即使在按引用傳遞時也會呼叫複製建構函式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!