0 原子操作
原子操作就是單位操作,也就是說操作過程不能被中斷
下面**中每條語句看起來是原子操作,其實不是原子操作;
int main(0
這兩條c語句度不是原子操作,某條彙編語句可能會被其他程序或者執行緒打斷
使對整形資料(int)操作變成原子操作,要依靠乙個資料型別:atomic_t
atomic_t n; //定義乙個原子變數
atomic_set(&n,2);//將變數初始值設為2
atmoic_add(5,&n);//將變數加5
atomic_dec(&n);//將變數減1
ptink(「n%d\n」,atomic_read(&n));//輸出n的值
實現原子操作方法;
1 自旋鎖
自旋鎖它是為為實現保護共享資源而提出一種鎖機制。其實,自旋鎖與互斥鎖比較類似
,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有乙個保持者,也就說,在任何時刻最多只能有乙個執行單元獲得鎖。但是兩者在排程機制上略有不同。對於互斥鎖,如果資源已經被占用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖,"自旋"一詞就是因此而得名。
使用;定義:
spinlock_t lock;//定義
spin_lock_init(&lock);//初始化
spin_lock(&lock);//獲取,沒獲取就被阻塞 spin_trylock(&lock)不阻塞 立即返回 成功返回非0 不成功返回0
.......
.......
臨界區**
.........
spin_unlock(&lock);//釋放
2 訊號量
訊號量又稱為訊號燈,它是用來協調不同程序間的資料物件的,而最主要的應用是共享記憶體方式的程序間通訊。本質上,訊號量是乙個計數器,它用來記錄對某個資源(如共享記憶體)的訪問狀況。一般說來,為了獲得共享資源,程序需要執行下列操作:
(1) 測試控制該資源的訊號量。
(2) 若此訊號量的值為正,則允許進行使用該資源。程序將訊號量減1。
(3) 若此訊號量為0,則該資源目前不可用,程序進入睡眠狀態,直至訊號量值大於0,程序被喚醒,轉入步驟(1)。
(4) 當程序不再使用乙個訊號量控制的資源時,訊號量值加1。如果此時有程序正在睡眠等待此訊號量,則喚醒此程序。
使用:struct semaphore sem;//定義
static inline void sema_init(struct semaphore *sem,int val);//初始化
void down (struct semaphore *sem) ;//
獲取訊號量,
沒獲取到就使當前程序睡眠
另外乙個 downtrylock(struct semaphore *sem); 不睡眠 立即返回
.......
.......
臨界區**
.........
extern void up (struct semaphore *sem);//
釋放訊號量
3 互斥體
互斥體實現了「互相排斥」(mutual exclusion)同步的簡單形式(所以名為互斥體
(mutex))。互斥體禁止多個執行緒同時進入受保護的**「臨界區」(critical section)。因此,在任意時刻,只有乙個執行緒被允許進入這樣的**保護區。任何執行緒在進入臨界區之前,必須獲取(acquire)與此區域相關聯的互斥體的所有權。如果已有另一線程擁有了臨界區的互斥體,其他執行緒就不能再進入其中。這些執行緒必須等待,直到當前的屬主線程釋放(release)該互斥體。
使用;struct mutex my_mutex;//
定義mutex_init(&my_mutex);//
初始化mutex_lock(struct mutex *lock) ;//另
獲取外乙個 mutex_trylock(struct mutex *lock)(沒獲取到也補睡眠,立即返回)
.......
.......
臨界區**
.........
void mutex_unlock(struct mutex *lock);//釋放
自旋鎖和訊號量
核心同步措施 用於linux核心 為了避免併發,防止競爭。核心提供了一組同步方法來提供對共享資料的保護。我們的重點不是介紹這些方法的詳細用法,而是強調為什麼使用這些方法和它們之間的差別。linux使用的同步機制可以說從2.0到2.6以來不斷發展完善。從最初的原子操作,到後來的訊號量,從大核心鎖到今天...
自旋鎖和訊號量
今天在閱讀核心 時遇到了自旋鎖函式,於是查閱資料,學習了一下自旋鎖和訊號量的知識。自旋鎖 自旋鎖是專為防止多處理器併發而引入的一種鎖,它應用於中斷處理等部分。對於單處理器來說,防止中斷處理中的併發可簡單採用關閉中斷的方式,不需要自旋鎖。自旋鎖最多只能被乙個核心任務持有,如果乙個核心任務試圖請求乙個已...
自旋鎖,互斥鎖,訊號量
自旋鎖,互斥鎖,訊號量 樂觀鎖和悲觀鎖只是一種理論,是從思想上劃分的。自旋鎖和互斥鎖是應用層確確實實的鎖,用於同步訪問控制 如果一定要劃分,從只有乙個執行緒可以擁有鎖來說,我覺得自旋鎖和互斥鎖應該都屬於悲觀鎖,因為一般的應用不需要支援事物回滾的操作。但是沈詢的直播中說,互斥鎖屬於悲觀鎖 sleep ...