我有一個經典的生產者/消費者問題。用於生產的代碼是這樣的:基於陣列的有界緩衝區中的空元素
#define BUFFER_SIZE 10
while (true) {
/* Produce an item */
while (((in + 1) % BUFFER_SIZE) == out)
; /* do nothing -- no free buffers */
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
}
而且消費者:
while (true) {
while (in == out)
; // do nothing -- nothing to consume
// remove an item from the buffer
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
return item;
}
這工作得很好,但問題是,當前八件充滿了和in=9
和out=0
,製片人坐在那裏並沒有填充最後一個(第九個)元素。這也發生在說,in=4
和out=5
。在任何情況下,即使一個插槽仍然爲空,一個元素仍留空,並且隊列顯示爲「已滿」。
我可以想出一些複雜的檢查,但我需要知道是否有一個乾淨的解決方案來填補整個隊列。我已經嘗試在第一次遞增,然後將item
,但也會遇到類似的問題。 (對於in
和out
,初始化爲-1
也不起作用)。
我想知道,爲什麼你不使用任何現成的和經過良好測試的解決方案/庫中的任何一種來解決這些問題? – PlasmaHH 2012-03-01 14:02:59
因爲我試圖教人們如何創建這些庫中的一個。因此我的問題是「最好的代碼」。我不想教我的學生從我自己的想法/經驗中得到的不良做法。徵求SO專家的意見。 :) – recluze 2012-03-01 14:04:21
哦,和我爲什麼不使用鏈表的原因相同 - 因爲我想教他們如何使用數組(以及它導致的問題)。 – recluze 2012-03-01 14:05:04