[英]POSIX threads and fairness (semaphores)
我用 C 創建了一個程序,它創建了 2 個緩沖區。 緩沖區索引包含單個字符,'A' 或 'b' 等...為了了解有關多線程的更多信息,我根據生產者/消費者問題創建了一組信號量,以從緩沖區中生成字符和使用字符。 每個緩沖區有 3 個生產者線程和 10 個消費者線程。 消費者從每個緩沖區中取出一個項目,然后報告它(也釋放消費項目的內存)。 現在,從我讀過的內容來看, sem_wait() 應該在退出阻塞狀態時發出“最長等待線程”的信號(我在一本書和在線 POSIX 庫中讀到了這一點)。
現在,這真的是真的嗎?
我所做的應用程序應該讓消費者和生產者在同一個 sem_wait() 門等待,但生產者進入臨界區的時間是任何消費者的兩倍多。 消費者確實有一個額外的信號量要等待,但這不應該有那么大的區別。 我似乎無法弄清楚為什么會這樣,所以我希望其他人能做到。 如果我在生產者線程上 sleep(1) ,消費者會很好地進入並且緩沖區在 0 個項目附近徘徊......就像我認為否則會發生。
此外,線程創建順序是否應該在我如何構建程序以確保公平性方面發揮任何作用?
IE,以循環方式生成每種類型的一種,直到每個人都被創建並運行。
有沒有任何人可以向我描述建立更公平的線程訪問系統的方法? 我讀過創建 FIFO 隊列系統可能是一種解決方案,其中最長的等待線程具有最高優先級(我認為 sem_wait() 無論如何都會這樣做)。
只是想知道基本線程和更高級別線程都有哪些方法。
POSIX 標准實際上是說,只有當SCHED_FIFO
或SCHED_RR
調度策略適用於被阻塞的線程時, “等待時間最長的最高優先級線程才會被解除阻塞” 。
如果您沒有使用這兩個實時調度策略之一,那么信號量不必是“公平的”。
多線程軟件只有在以下情況下才有意義
你怎么定義公平。 當然,如果核心無所事事,那么他們就可以承擔工作更好。 如果一個核心永遠不會被查看是否重要?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.