在互斥資料訪問中有一種多讀少寫的情況。正對這麼一種情形,我們也提出了讀寫鎖的方案。但是呢,這個鎖有些缺陷。什麼缺陷呢?那就是,這個寫鎖需要在所有的讀鎖完成之後才能寫。否則的話,寫鎖需要這麼一直等下去。
那麼,有沒有什麼辦法能使得寫操作快速一點進行呢?那就是順序鎖。
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排程多執行緒時,在執行時序上是交叉進行的而造成亂序獲得多把鎖,從而形成死鎖,所以,解決順...