迴圈佇列是很多人喜歡用的一種資料結構。本著先來先服務的特性,迴圈佇列是一種十分簡單、健壯的資料結構。不像鍊錶、二叉樹,如果使用不慎,就會造成很大的麻煩,但是在迴圈佇列上面則沒有這個煩惱。
同樣而言,迴圈佇列具有很強的並行性,如果服務的資料比較少,那麼完全可以利用兩個執行緒進行資料的儲存和處理工作。只要注意在編寫佇列的時候不要引入公共引數,那麼幾乎不會有任何的並行煩惱。這其中的原因就在於,迴圈佇列沒有公共變數,所以不存在對公共變數的修改問題。佇列是否為空或者是否為滿,完全可以由佇列的start和end這兩個引數決定,而這兩個引數的修改是分開來的,不可能在乙個執行緒上面解決,這就是佇列並行的本質原因。
#include #include #include #include struct queue
;#define status int
#define true 1
#define false 0
struct queue* alloc_queue(int count)
p_queue = (struct queue*)malloc(sizeof(struct queue));
if(null == p_queue)
memset(p_queue, 0, sizeof(struct queue));
p_queue->count = count;
p_queue->buffer = (int*)malloc(sizeof(int)* count);
if(null == p_queue->buffer)
memset(p_queue->buffer, 0, sizeof(int) * count);
return p_queue;
error2:
free(p_queue);
error1:
return null;
}status add_data_into_queue(struct queue* p_queue, int data)
if(p_queue->end == (p_queue->start + 1) % p_queue->count)
p_queue->buffer[p_queue->start] = data;
p_queue->start = (p_queue->start + 1) % p_queue->count;
return true;
}status get_data_from_queue(struct queue* p_queue, int* p_data)
if(p_queue->start == p_queue->end)
p_data[0] = p_queue->buffer[p_queue->end];
p_queue->end = (p_queue->end + 1) % p_queue->count;
return true;
}static void* set_func(void* args)
while(1)
end:
return null;
}static void* get_func(void* args)
while(1)
end:
return null;
}int main(int argc, char* argv)
if(pthread_create(&pid1, null, set_func, p_queue))
if(pthread_create(&pid2, null, get_func, p_queue))
while(1)
end:
return 1;
}
軟體隨想錄
最近閱讀了由阮一峰翻譯的,有程式設計師部落酋長之稱的 joel 撰寫的 軟體隨想錄 精華摘抄如下 就如同所有行業最好的人才一樣,那些優秀的程式設計師是不會出現在招聘市場的。通常優秀的程式設計師在整個職業生涯中,可能會有4次求職。實習生制度創造了輸送優秀人才的管道,但是這個管道比較長,而且一路上損耗很...
專案隨想錄
發現自己不怎麼會起題目了。中午回去還沒走到寢室,就接到劉老師的 說要把程式調通,於是中午吃完飯立馬跑回去,把顯示問題解決了。其實那個無效數字問題是因為在hql語句中使用了cast pw as integer 將字串轉成integer型,可是資料庫中的內容程式設計了字母加數字,自然會轉換失敗了,唉,真...
雜文 隨想錄
這裡是一些隨想。關於名為二氫婦女的使用者本人,希望 ta 能有乙個美好的未來。科學雖然給我們許多驚奇,但也攪壞了我們許多好夢。當登上了月球的那一刻,一切有關月的夢都被現實的蒼涼所破碎了。從那一步邁出起,廣寒宮破碎,輝夜姬亦未曾回到月上,阿爾忒彌斯丟失了金弓與駕月之車,一切有關月的神話於此失去光輝,人...