將物件參考傳遞給執行緒函數
使用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中文網其他相關文章!