簡體   English   中英

如何確定性地使用std :: this_thread :: yield()?

[英]How to use std::this_thread::yield() deterministically?

在開發基於VoIP的應用程序時,我們有一個通用的多線程C ++ 11模塊。 它在iOS,MacOS中運行良好,但在Android中發現線程調度難度。

可選設計說明(僅在感興趣時)

我有幾個線程與消息隊列一起運行。

  1. Master(將數據寫入SSL_Read隊列中接收的套接字)
  2. SSL_Read(從SSL讀取數據並在其隊列中更新)
  3. SSL_Write(將數據寫入直接從Socket線程接收的SSL)
  4. 每個套接字的線程數(從套接字讀取數據並發送到SSL_Write隊列)

1-2相關,3-4相關。
我觀察到在許多調用期間,只有2個線程正在運行,而其他2個線程沒有運行時間。 由於觀察到哪種單向語音路徑。

問題

我懷疑這是一個Android Linux問題,為此,我有一個未答復的帖子:
c ++ 11 Android的多線程問題,其中一些線程沒有正確安排
經過std :: this_thread :: yield()用法?

目標是為所有線程提供類似的時間切片。 嘗試以下選項:

  1. 當消息隊列填滿超出一定限度時,我決定使用std::thread::yield() ; 例如來自1個線程的10條消息。 我在循環中嘗試了yield() 1次和100次,但沒有優勢。 同一個線程繼續運行。
  2. sleep_for()選項的內容與0和100毫秒相同。 相同的線程繼續運行。
  3. 嘗試將所有線程的nice()值更改為-10,-20,但沒有運氣。

如何有效地使用std::this_thread::yield()而不會燒掉太多的CPU周期?

std::this_thread::yield()絕對沒有任何作用是合法的。 它為調度程序提供了安排另一個線程的機會; 調度程序不必利用它。

你可以試試:

  1. 通過將工作打包到通用任務隊列中,讓每個線程都能夠處理任何工作需要做的事情。 這樣,哪個線程完成工作並不重要,當有線程執行時,最重要的工作就完成了。

  2. 在線程之間添加同步,例如屏障機制(參見例如boost的屏障類),以保持所有4個線程同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM