linux 併發控制總結

2021-06-20 09:21:01 字數 2645 閱讀 5305

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.保證事務的...