2012-11-06 36 views
1

我有一些麻煩,在我的操作系統類家庭作業寫Pseduocode,我們正在編程C.的僞碼生產者消費者同步

您將實現生產者 - 消費者與程序N個元素,P個生產者線程和C個消費者線程的有界緩衝區隊列(N,P和C應該是程序的命令行參數,以及三個附加參數X,Ptime和Ctime,下面將對此進行描述)。 每個
生產者線程應該在隊列中排隊X個不同的數字(在每次調用Enqueue之間旋轉等待Ptime * 100,000個週期)。每個消費者線程
應該使隊列中的P * X/C項出隊(在每次調用Dequeue之間旋轉等待Ctime * 100,000個週期 )。
主程序應該創建/初始化 界緩衝隊列,打印時間戳,產卵關C消費者線程& P
生產者線程,等待所有線程完成,然後打印出來另一個 時間戳&執行持續時間。

我的主要困難是理解我的教授通過自旋等待變量的次數達到100,000次。我用粗體顯示了令我困惑的部分。

我知道一個時間戳將用於打印每個線程之間的差異。我們目前正在使用信號量和實現同步。任何建議上述查詢將不勝感激。

回答

3

我猜這意味着忙等待;反覆檢查循環條件,並在緊密循環消耗不必要的CPU功率:

while (current_time() <= wake_up_time); 

一個在理想情況下使用的東西,直到它喚醒外部懸吊你的線程,由調度(使資源如CPU可以改行其他地方):

sleep(2 * 60 * 1000 ms); 

或至少放棄一些 CPU(即不所以緊):

while (current_time() <= wake_up_time) 
    sleep(100 ms); 

但我想他們不希望你手動調用調度器,暗示操作系統(或你的線程庫),這是一個上下文切換的好時機。

我不確定什麼週期是;在組裝它們可能是CPU週期,但考慮到你的問題被標記C,我敢打賭,他們只是循環迭代:

for (int i=0; i<Ptime*100000; ++i); //spin-wait for Ptime*100,000 cycles 

雖然它總是最安全的要求誰發出的功課。

+1

該死的很好的答案......但是:假設沒有人理解這個問題是安全的,特別是問了這個問題的教授;-) – corlettk

2

忙着等待紡絲是一種技術,其中一個過程重複地檢查以查看是否條件是true,如鍵盤輸入是否是可用的,或者如果鎖可用。

所以分配說後病情

同樣每個消費者線程 應該出列從隊列P*X/C項目和生產下一個元素和排隊X不同的元素之前等待的ptime * 100000時間每次消費後,等待ctime * 100000

+0

我讀了「自旋等待Ptime * 100,000 **週期**」,我將其解釋爲字面上的「處理週期」,即「時鐘滴答」......即不是「時間」。 – corlettk

1

我懷疑你的教授的是一個完整的朴子 - 通過實際要求的worste「忙等待」技術,所有腦幹:

int n = pTime * 100000; 
for (int i=0; i<n; ++i) ; // waste some cycles. 

我也懷疑他仍然採用了翼龍大腿骨頭作爲柺杖,有一個非常好的(乾燥的)洞穴,還有一個大禿patch補丁的伴侶...... O/S傢伙傾向於這樣。它隨着涼爽的鬍鬚。

難怪他徹底的現代學生誤解了他。他需要(重新)學習如何咕IN IN TUNE。

乾杯。基思。