2014-02-28 140 views
0

我在C中創建了一個程序,創建了2個緩衝區。緩衝區索引包含單個字符'A'或'b'等......爲了更多地瞭解多線程,我創建了一組基於生產者/消費者問題的信號量來生成字符並從緩衝區中消耗字符。我有3個生產者線程爲每個緩衝區和10個消費者線程。消費者從每個緩衝區中取一個項目,然後報告(也釋放消耗項目的內存)。現在,從我讀過的內容來看,sem_wait()應該表示出現阻塞狀態時的「最長等待線程」(我在一本書和在線的POSIX庫中閱讀了這篇文章)。POSIX線程和公平(信號量)

現在,這是真的嗎?

我所做的應用程序應該讓消費者和生產者都在同一個sem_wait()門口等待,但生產者進入關鍵部分的時間是任何消費者的兩倍多。消費者確實有一個額外的信號量可以等待,但這不應該產生巨大的差異。我似乎無法弄清楚爲什麼會發生這種情況,所以我希望別人也這麼做。如果我在生產者線程上睡覺(1),那麼消費者就會進入正常狀態,並且緩衝區在0項左右徘徊......就像我認爲會發生的情況一樣。

此外,如果線程創建順序在我如何爲公平構造程序中扮演任何角色?

IE,以循環方式產生每種類型之一,直到每個人都被創建並運行。

是否有任何方法可以讓任何人向我描述建立一個更公平的線程訪問系統?我讀過創建FIFO隊列系統可能是一個解決方案,其中最長的等待線程具有最高的優先級(這正是我認爲sem_wait()會做的)。

只是想知道什麼方法是基本和更高級別的線程。當

  1. 你有多個內核與
  2. 一些算法更容易發揮編程

你如何定義公平

回答

3

POSIX standard居然說「已等待時間最長的最高優先級的線程應暢通」只有當SCHED_FIFOSCHED_RR調度策略適用於阻塞線程。

如果您沒有使用這兩種實時調度策略之一,那麼信號量不必是「公平的」。

0

多線程軟件纔有意義。當然,如果一個核心無所事事,那麼他們承擔這項工作肯定會更好。如果一個核心從來沒有看到過,它有關係嗎?

+0

我會在這種情況下定義fair,因爲「綁定到關鍵部分的每個線程都獲得與其他相同類型的線程相同的使用量。」因此,對於任何與緩衝區綁定的生產者,他們都應該生產大致相同數量的物品。對於每個消費者,他們應該消費大致相同數量的物品。此外,綁定到同一臨界區的任何不同類型的線程也應該遵循此規則。我「認爲」這就是我所說的公平。每個線程在做某件事情時都會得到公平的動搖嗎? – user2079828

+0

當你有一個鏟子和兩個工人時,這真的很重要嗎?兩人都不在乎什麼時候喝茶或者全身都在工作? –

+0

「Mattering」無關緊要。我想創建一個程序,在這個程序中,在不引入鎖步或將線程掛起的情況下,滿足上面的規則。此外,在這種情況下,消費者似乎沒有生產者那麼快,不管有多少。我試圖找出原因。編輯:我明白你的意思,但它與我知道「爲什麼」無關。 – user2079828