在線程的while循環內調用joinable()函數以測試線程上是否存在加入請求或是否存在我目前不考慮的任何副作用是否合法?測試連接是否已被調用
0
A
回答
1
在線程的while循環中調用
joinable()
函數來測試線程上是否存在加入請求或是否存在我目前不考慮的副作用是否合法?
這可能會導致數據競爭(因此未定義行爲),除非你使用某種手動同步的。
std::thread::join()
是非const成員函數,因此它的任何呼叫,其與任何其它的呼叫可能併發到相同的對象將衝突的成員函數,並造成數據的比賽。
因此,如果一個線程調用std::thread::join()
並且另一個線程在同一個對象上同時調用std::thread::joinable()
,那麼您將遇到數據競爭和未定義的行爲。
你可以通過使用一個互斥來序列化調用來解決這個問題,以便在任何時候只有一個對象訪問線程,但是我會考慮你的設計是否有意義。提示:它沒有。撥打joinable()
會告訴您線程是否已加入,如果已撥打join()
,則不會。線程在運行時不能加入(對join()
的調用將阻止並等待它完成)。所以正在運行的線程永遠不會看到joinable() == false
對於管理它的std::thread
對象,因爲如果它能夠調用joinable()
那麼它仍然在運行,所以它可以連接!
所以:除非你非常小心
試圖做到這一點的風險不確定的行爲。
無論如何這是沒有道理的。
而是使用類似一個std::atomic<bool>
(或bool
和std::mutex
)記錄該線程是否已經請求停止運行,並從正在運行的線程檢查。
相關問題
- 1. 測試名稱是否已被使用
- 2. 檢測數據連接是否已被禁用
- 3. 測試JavaScript是否已被修改
- 4. 測試按鈕是否已被點擊
- 5. 測試UITableViewCell是否已被刪除
- 6. 如何測試塊是否被調用
- 7. 檢測連接是否已建立
- 8. 測試套接字是否連接
- 9. 測試Java接口是否已被代理
- 10. 如何測試函數是否被調用(單元測試角)
- 11. 檢測wifi是否啓用(不管它是否已連接)
- 12. 調試器已連接 - cscript
- 13. 測試連接是否爲錯誤
- 14. 測試Socket是否連接在C#
- 15. 如何使用已定義的參數(toHaveBeenCalledWith)測試函數是否被調用
- 16. 檢測插件是否已被應用
- 17. 測試方法是否被promise回調調用
- 18. 檢查PHP類是否已被調用
- 19. 知道驗證是否已被調用
- 20. ServiceStack NUnit測試調試連接被拒絕問題
- 21. SystemError:連接已被禁用
- 22. 測試表中連接的行是否真正連接
- 23. 如何測試HttpException是否是「客戶端已斷開連接」。錯誤?
- 24. AngularJS測試是否已經調用$ scope方法
- 25. 測試一個函數是否在Ruby on Rails單元測試中被調用
- 26. 檢測通知是否已被刪除
- 27. 檢測ObservableCollection是否已被修改
- 28. Python:測試詞典(詞典)條目是否已被修改
- 29. 如何測試一個文件是否已被pickle創建?
- 30. 檢查是否一些對象已經被測試
「測試線程上是否有加入請求」 - 這不是joinable()告訴你的。 –
標準中沒有辦法檢查線程是否調用了'join'。如果你想終止線程,你可以使用'condition_variable'或'atomic'。 –
NathanOliver
謝謝。使用condition_variable和原子工作正常。 –
Gustavo