[英]How to use std::this_thread::yield() deterministically?
在開發基於VoIP的應用程序時,我們有一個通用的多線程C ++ 11模塊。 它在iOS,MacOS中運行良好,但在Android中發現線程調度難度。
我有幾個線程與消息隊列一起運行。
1-2相關,3-4相關。
我觀察到在許多調用期間,只有2個線程正在運行,而其他2個線程沒有運行時間。 由於觀察到哪種單向語音路徑。
我懷疑這是一個Android Linux問題,為此,我有一個未答復的帖子:
c ++ 11 Android的多線程問題,其中一些線程沒有正確安排 。
經過std :: this_thread :: yield()用法?
目標是為所有線程提供類似的時間切片。 嘗試以下選項:
std::thread::yield()
; 例如來自1個線程的10條消息。 我在循環中嘗試了yield()
1次和100次,但沒有優勢。 同一個線程繼續運行。 sleep_for()
選項的內容與0和100毫秒相同。 相同的線程繼續運行。 nice()
值更改為-10,-20,但沒有運氣。 如何有效地使用std::this_thread::yield()
而不會燒掉太多的CPU周期?
std::this_thread::yield()
絕對沒有任何作用是合法的。 它為調度程序提供了安排另一個線程的機會; 調度程序不必利用它。
你可以試試:
通過將工作打包到通用任務隊列中,讓每個線程都能夠處理任何工作需要做的事情。 這樣,哪個線程完成工作並不重要,當有線程執行時,最重要的工作就完成了。
在線程之間添加同步,例如屏障機制(參見例如boost的屏障類),以保持所有4個線程同步。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.