首頁 >後端開發 >C++ >如何正確地將物件參考傳遞給 C 11 std::thread 函數?

如何正確地將物件參考傳遞給 C 11 std::thread 函數?

DDD
DDD原創
2024-11-26 11:47:10455瀏覽

How to Correctly Pass Object References to C  11 std::thread Functions?

將物件參考傳遞給執行緒函數

使用C 11 std::thread 介面時,嘗試傳遞物件參考時可能會遇到問題物件引用作為線程函數的參數。即使傳遞簡單整數時也會出現此問題,如下列程式碼所示:

void foo(int& i) {
    // Do something with i
    std::cout << i << std::endl;
}

int k = 10;
std::thread t(foo, k);

此程式碼按預期編譯和執行,但傳遞std::ostream 參考會導致編譯錯誤:

void foo(std::ostream& os) {
    // Do something with os
    os << "This should be printed to os" << std::endl;
}

std::thread t(foo, std::cout);

編譯錯誤的原因

編譯錯誤源自於std::thread的已刪除構造函數。預設情況下,執行緒會複製其參數,從而無法直接傳遞引用。

解決方案:使用std::ref

將引用作為參數傳遞給如果是線程函數,則必須使用std::ref (或用於常數引用的std::cref)包裝它。這將創建一個具有值語義的引用包裝器,允許存在引用的副本。

std::thread t(foo, std::ref(std::cout));

透過使用 std::ref,您可以將參考傳遞給執行緒函數,從而可以直接操作所傳遞的目的。但是,確保引用的物件在執行緒執行期間保持活動狀態至關重要。

以上是如何正確地將物件參考傳遞給 C 11 std::thread 函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn