C 多執行緒 順序鎖

2021-10-02 02:23:16 字數 1040 閱讀 5200

在互斥資料訪問中有一種多讀少寫的情況。正對這麼一種情形,我們也提出了讀寫鎖的方案。但是呢,這個鎖有些缺陷。什麼缺陷呢?那就是,這個寫鎖需要在所有的讀鎖完成之後才能寫。否則的話,寫鎖需要這麼一直等下去。

那麼,有沒有什麼辦法能使得寫操作快速一點進行呢?那就是順序鎖。

typedef

struct _sequence_lock

sequence_lock;

有了這麼乙個資料結構之後。那麼讀鎖怎麼開始呢,

unsigned

intget_lock_begin

(sequence_lock* hseqlock)

intget_lock_retry

(sequence_lock* hseqlock,

unsigned

int value)

自然寫鎖也需要修改了,

void

get_write_lock

(sequence_lock* hseqlock)

void

release_write_lock

(sequence_lock* hseqlock)

如果應用呢,其實也不難,

void

read_process

(sequence_lock* hseqlock)

while

(get_lock_retry

(hseqlock, sequence));

}void

write_process

(sequencce_lock* hseqlock)

總結:

(1)讀鎖退出有兩個條件,要麼寫操作正在進行呢,要麼沒有寫鎖

(2)寫鎖之間需要互斥操作

(3)互斥操作的資料不能是指標,否則有可能在訪問的時候會造成異常,因為有可能邊寫邊讀

(4)順序鎖代替不了讀寫鎖,因為讀寫鎖可以保證所有的資料操作,而順序鎖不行

C 多執行緒與鎖

多執行緒是小型軟體開發必然的趨勢。c 11將多執行緒相關操作全部整合到標準庫中了,省去了某些坑庫的編譯,真是大大的方便了軟體開發。多執行緒這個庫簡單方便實用,下面給出簡單的例子 include include includeusing namespace std volatile int val m...

C 多執行緒 巢狀鎖

巢狀鎖這個概念,主要是為了根據程式設計中的一種情形引申出來的。什麼情況呢,我們可以具體說明一下。假設你在處理乙個公共函式的時候,因為中間涉及公共資料,所以你加了乙個鎖。但是,有一點比較悲哀。這個公共函式自身也加了乙個鎖,而且和你加的鎖是一樣的。所以,除非你的使用的是訊號量,要不然你的程式一輩子也獲取...

Java多執行緒與鎖模型 順序鎖與資源鎖

順序鎖 當應用程式使用2把以上的鎖時,就容易出現因為多執行緒獲取鎖的順序不同而死鎖的情形,包括交叉獲取應用程式範圍內的多把已知鎖 交叉獲取應用程式與第三方方法中的多把鎖而造成的順序死鎖。絕大多數死鎖都是因為cpu排程多執行緒時,在執行時序上是交叉進行的而造成亂序獲得多把鎖,從而形成死鎖,所以,解決順...