首頁 > 後端開發 > C++ > 如何安全地將物件參考傳遞給 C 11 執行緒?

如何安全地將物件參考傳遞給 C 11 執行緒?

Patricia Arquette
發布: 2024-11-19 14:57:03
原創
590 人瀏覽過

How Can I Safely Pass Object References to C  11 Threads?

將物件參考參數傳遞給執行緒函數:建構子問題

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板