C 佇列和棧 執行緒安全

2022-01-12 11:40:03 字數 2137 閱讀 8968

佇列是其元素以先進先出(fifo)的方式來處理集合,先入隊的元素會先讀取。

棧是和佇列非常類似的另乙個容器,棧和佇列最大的區別是後進先出(lifo),也可以說成先進後出。

佇列在現實生活中的例子數不勝數。例如:排隊打飯,排隊購買機票,列印佇列中等待處理的列印業務等

棧在生活中的例子也不少。例如:物流裝車,火車排程等

那麼,關於佇列和棧在c#的用法介紹如下:

佇列主要用法:

棧主要用法:

上述兩個圖中分別展示了佇列:queue及棧stack

而在實際的c#程式設計中,無論是queue還是stack都無法保證執行緒安全,換句話說,他們存在普通集合list存在的併發問題。關於這個問題,大家可以參考我的部落格:c# 集合-併發處理-鎖or執行緒

using

system;

using

system.collections.concurrent;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

stackqueue

public

static

void rudui() //

定義乙個入隊方法 先進先出

; productqueue.enqueue(model);}}

public

static

void ruzhan() //

定義乙個入棧方法 先進後出

; productstack.push(model);}}

public

static

void ruduicc() //

保證執行緒安全的入隊方法

; productcq.enqueue(model);}}

public

static

void ruzhancc() //

保證執行緒安全的入棧方法

; productsk.push(model);}}

}public

class

product

public

string category

public

int sellprice }}

view code

執行結果如下:

由此可見,queue入隊和stack入棧都存在併發的問題。

上述**中,提供了concurrentqueue和 concurrentstack兩種全新的佇列、棧。**注釋中也提到,這是netfrm4.0才提出的執行緒安全佇列及棧集合。

換句話說,使用concurrentqueue和 concurrentstack兩種全新的佇列、棧,無需考慮併發問題!

當然,如果您不習慣使用concurrentqueue和 concurrentstack,那麼您也可以結合c# lock(object) 進行**臨界,這種加鎖的方式也能解決queue和stack併發的問題。不過,加鎖就意味著額外開銷,效率會低一些。

加鎖的方式在我的部落格:c# 集合-併發處理-鎖or執行緒 中都有體現。

更多興趣閱讀《也是關於佇列應用的哦》:c# 定時器和佇列結合,賣包子啦,timer、 autoresetevent、 manualresetevent

當然,如果遍歷佇列或者棧,可以使用foreach(var a in ...)

今天只是做個整理,沒什麼特別的意義,有興趣的小虎斑點個讚吧!謝謝!

@陳臥龍的部落格

c 棧和佇列

c 棧 include using std stack s.empty 如果棧為空返回1,否則返回0 s.size 返回棧中元素的個數 s.pop 刪除棧頂元素但不返回其值 s.top 返回棧頂的元素,但不刪除該元素 s.push 在棧頂壓入新元素 測試例項 include include usin...

c 棧和佇列

使用標準庫的棧和佇列時,先包含相關的標頭檔案 include include 定義棧如下 stackstk 定義佇列如下 queueq 棧提供了如下的操作 cpp view plain copy s.empty 如果棧為空返回 true,否則返回 false s.size 返回棧中元素的個數 s.p...

C 棧和佇列

使用標準庫的棧和佇列時,先包含相關的標頭檔案 include include 定義棧如下 stackstk 定義佇列如下 queueq 棧提供了如下的操作 cpp view plain copy s.empty 如果棧為空返回 true 否則返回 false s.size 返回棧中元素的個數 s.p...