atomic_t
atomic_t atom = atomic_init(1);
atomic_dec_and_test(&atom);
atomic_inc(&atom);
spin_lock_t
spinlock_t lock;
spin_lock_init(&lock);
-define_spinlock(lock);
spin_lock(&lock);
spin_trylock(&lock);
spin_unlock(&lock);
rwlock_t
rwlock_t lock;
rwlock_init(&lock);
-define_rwlock(lock);
read_lock(&lock);
read_trylock(&lock);
read_unlock(&lock);
write_lock(&lock);
write_trylock(&lock);
write_unlock(&lock);
不能同時申請讀自旋鎖和寫自旋鎖,否則照成死鎖:
-read_lock(&lock);
-write_lock(&lock);//執行就造成死鎖
獲取寫鎖時,計數器減0x01000000,判斷是否為0,是則表示沒有其他的讀者或者寫者,獲取鎖成功;不為0則表示有其他讀者或者寫者,獲取鎖失敗。
seqlock_t
順序鎖與讀寫自旋鎖類似,只是為寫鎖賦予了更高的許可權。在讀寫自旋鎖rwlock_t中,當讀鎖獲取讀自旋鎖時,寫鎖必須等待。順序鎖在獲取讀鎖的時候,仍然可以獲取寫鎖,並立即執行寫臨界區的**。寫鎖永遠不會被讀鎖阻塞。寫鎖仍然可以被寫鎖阻塞。
typedef struct seqlock_t;
當獲取順序鎖write_seqlock函式時,seqlock_t.sequence變數會被加1.釋放寫順序鎖write_sequnlock函式時,該變數仍然加1.因此,在獲取順序鎖,但沒有釋放的時候,seqlock_t.sequence變數的值是奇數。釋放寫順序鎖後,該變數是偶數。
//標準執行讀臨界區**:
unsigned seq;
dowhile(read_seqretry(&seqlock, seq));
由上段**可以看出,在執行讀臨界區**的時候,如果發生寫操作,read_seqretry函式會返回非0值。**將do...while再執行一次。也就是說臨界區**發生了變化,需要重新讀取一次。
//標準執行寫臨界區**
seqlock_t lock;
seqlock_init(&lock);
write_seqlock(&lock);
//寫臨界區**。
write_sequnlock(&lock);
semaphore
在未獲取訊號量的時候,進入休眠狀態。
訊號量利用等待佇列實現對臨界區的鎖定。
semaphore sem;
sema_init(&sem, 1);//後面的數字表示訊號量的初始值
down(&sem); //p操作,申請訊號量。
up(&sem); //v操作,釋放訊號量。
down函式用於獲取訊號量,沒有獲取到訊號量導致程序休眠,中斷無法喚醒,不能再中斷上下文中使用。
down_interrupt(&sem);//在休眠中可以被中斷喚醒.
down_trylock(&sem);//不會休眠,可用於中斷上下文。
rw_semaphore
多個讀,單個寫
rw_semaphore rw_sem;
init_rwsem(&rw_sem);
down_read(&rw_sem);
… …//臨界**段
up_read(&rw_sem);
down_write(&rw_sem);
… …//寫臨界**段
up_write(&rw_sem);
mutex
struct mutex my_mutex;
mutex_lock(&my_mutex);
mutex_unlock(&my_mutex);
mutex_trylock(&my_mutex);
mutex_interruptible(&my_mutex);
completion完成量
完成量用於乙個執行單元等待另乙個執行單元執行完成某項工作。
struct completion;
struct completion my_completion;
init_completion(&my_completion);
-declare_completion(my_completion);
//使completion.done的值減1
wait_for_completion(&my_completion);//不能被中斷打斷
//可以被中斷打斷
wait_for_completion_interruptible(&my_completion);
complete(&my_completion);
complete_all(&my_completion);
complete使completion.done的值加1,complete_all使該值設為int的最大值。
linux併發控制
一.概念 1.併發 concurrency 指多個執行單元同時,並行被執行。2.併發的執行單元對共享資源,比如說,硬體資源,全域性變數,靜態變數等 訪問很容易導致競態 race conditions 舉個簡單事例,古代皇帝有很多妃子,皇帝第乙個時辰是宜妃的,第二個時辰是萱妃,最後時間是皇后的,這是原...
Linux併發控制
目錄 併發和競態 編譯亂序和執行亂序 中斷遮蔽 原子操作 位原子操作 自旋鎖訊號量 互斥體完成量 1.併發是多個執行單元同時並行的執行。2.競態是指併發操作對共享資源的訪問。競態的發生情況如下 1.對稱多處理器 smp 的多個cpu的程序 中斷之間的併發為核間併發。2.單個cpu內的多個程序併發訪問...
併發控制 簡單總結
預期讀者 1.初學者。2.想複習的人。3.原來學習併發覺得太複雜,沒搞清楚,想以更簡單的方式學習的人。4.懶得總結的人。下面,我就以乙個比較簡單的方式來總結,和你們分享。目標 併發控制要做的是協調併發事務的執行,保證資料完整不受破壞,同時避免使用者得到不正確的資料。主要目標有以下兩個 1.保證事務的...