如果在std::thread
和主線程(或任何其他線程)之間有共享變量,那麼即使您使用共享變量您在創建線程後立即執行thread::detach()
方法?C++ 11 std :: thread :: detach和對共享數據的訪問
11
A
回答
16
是的!在調用detach()
之後,全局變量,捕獲變量和傳入變量仍可訪問。
但是,如果您要調用detach,那麼您可能希望從創建該線程的函數返回,從而允許線程對象超出範圍。如果是這樣的話,你必須注意,該函數的所有本地代碼都不是通過引用或通過指針傳遞給線程。
您可以將detach()
視爲線程不需要創建線程本地任何東西的聲明。
在以下示例中,線程在超出作用域後始終在起始線程的堆棧上訪問int
。這是未定義的行爲!
void start_thread()
{
int someInt = 5;
std::thread t([&]() {
while (true)
{
// Will print someInt (5) repeatedly until we return. Then,
// undefined behavior!
std::cout << someInt << std::endl;
}
});
t.detach();
}
這裏有一些可能的方式來保持地毯從你的線程下被掃地出門:
- 聲明
int
的地方,不需要任何線程的生命週期內,不會超出範圍它(也許是全球性的)。 - 聲明共享數據爲
std::shared_ptr
並將其按值傳遞給線程。 - 按值傳遞(執行副本)到線程中。
- 將rvalue引用(執行移動)傳遞到線程中。
5
是的。拆線只是意味着當它完成後它清理完畢,你不再需要,也不允許它,join
它。
相關問題
- 1. Boost :: thread,glut和數據共享
- 2. XCode std :: thread C++
- 3. 訪問Pthreads共享數據
- 4. C++ 11線程detach不工作
- 5. MinGW和std :: thread
- 6. std ::線程訪問從共享庫加載的函數
- 7. std :: thread C++ 11無法解釋爲什麼
- 8. C++共享互斥量和類實例的11個線程
- 9. 局部性和共享訪問對象
- 10. 線程安全訪問對象之間共享的數據
- 11. C++ fork/std :: thread和boost :: timed_join
- 12. 在C++中自動調用std :: thread的函數11
- 13. 項目66:同步對共享可變數據的訪問
- 14. 在C++中使用原子和std :: thread 11
- 15. C++ 11共享Ptr,共享相同的引用計數器
- 16. 從std :: thread訪問類變量
- 17. C#線程共享數據
- 18. C++訪問共享庫的數組數據
- 19. 編譯共享庫(舊標準)與C++ 11共享庫
- 20. 多線程無法正常使用std :: thread(C++ 11)
- 21. 並行/異步訪問共享數據
- 22. boost :: thread和std :: unique_ptr
- 23. C++ 11共享指針和存儲器的矢量泄漏
- 24. C++共享指針問題
- 25. 使用std :: thread與std :: mutex
- 26. 什麼時候應該使用std :: thread :: detach?
- 27. 訪問共享內存中的數據C++ POSIX
- 28. 如何在C++ 11中的Mac OS X上命名std :: thread?
- 29. 共享對Google Bigquery數據集的訪問
- 30. C++ 11可以判斷std :: thread是否處於活動狀態?