將物件參考參數傳遞給執行緒函數:建構子問題
在C 11 中,std::thread 介面允許建立輕量級級線程。常見任務是將參數傳遞給這些執行緒函數,但在嘗試傳遞物件參考時可能會出現困難。
考慮以下範例:
void foo(int &i) { std::cout << i << std::endl; } int k = 10; std::thread t(foo, k);
此程式碼成功編譯並執行,如下所示整數被複製到執行緒函數中。但是,傳遞 std::ostream 物件參考不會編譯:
void foo(std::ostream &os) { os << "This should be printed to os" << std::endl; } std::thread t(foo, std::cout);
錯誤表示缺少或無法存取建構子。
解:使用 std::ref
執行緒預設複製它們的參數。要明確傳遞引用,需要一種替代方法。這就是 std::ref 的用武之地。它將物件引用包裝在值語義包裝器中。
透過使用std::ref,線程函數接收包裝器的副本,但包裝的引用仍然存在相同:
std::thread t(foo, std::ref(std::cout));
這使得線程函數能夠存取和修改原始對象,從而實現所需的功能。
這一點至關重要需要注意的是,被引用的物件必須在整個執行緒的執行過程中保持可訪問性。如果在執行緒完成之前刪除或修改它,可能會發生意外行為或當機。
以上是如何安全地將物件參考傳遞給 C 11 執行緒?的詳細內容。更多資訊請關注PHP中文網其他相關文章!