mutex(互斥量)
多執行緒併發的操作共享變數,會帶來一些問題,因為畢竟不是所有的操作都是原子性的(要麼不做,要麼全做完,不存在中間時刻)
下面寫乙個程式來說明:
1 #include2 #include3 #include4 #include5 #include6
7 8 int ticket = 20;//全域性變數,定義20張票
9 10 void *route(void *arg)
11 21 else
22 break;
23 }
24 }
25 26 int main()
27
執行結果如下:
我們發現出現了票數為負的情況,為什麼會這樣呢?
load:將共享變數ticket從記憶體載入到暫存器中
update:更新暫存器裡面的值,執行-1操作
有什麼解決辦法呢?
**必須要有互斥行為:當**加入臨界區執行時,不允許其他執行緒進入該臨界區
如果多個執行緒同時要求執行臨界區的**,並且臨界區沒有執行緒在執行,呢嗎只能允許乙個執行緒進入該臨界區
如果執行緒不在臨界區執行,那麼該執行緒不能組織其他執行緒進入臨界區
做到這三點,本質上就是需要一把鎖,linux提供的這把鎖叫互斥量
概念:事件a與事件b在任何一次事件中不會同時發生,則稱事件a和事件b互斥
執行緒互斥:倆個或多個執行緒不能同時訪問同一塊臨界資源(共享資源),即多個執行緒互斥的訪問同一塊資源
互斥量的介面:
1.初始化互斥量(兩種方法)
pthread_mutex_t mutex = pthread_mutex_initializer
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr)
引數:
2.銷毀互斥量
銷毀互斥量需要注意:
int pthread_mutex_destory(pthread_mutex_t *mutex);
互斥量加鎖與解鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
返回值:成功返回0,失敗返回錯誤號
呼叫pthread_lock時,會遇到以下情況
改進上面的買票系統:
1 #include2 #include3 #include4 #include5 #include6
7 8 int ticket = 20;
9 pthread_mutex_t lock;//建立互斥量
10 11 void *route(void *arg)
12 25 else
26
30 }
31 }
32 33 int main()
34
允許結果如下:
加入互斥鎖以後,我們發現票數就不會出現負的情況,但是我們同時發現,所有的票都被執行緒4買走了,這時我們就要引入同步的概念
條件變數:
條件變數函式:
1.初始化:
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *ret rict attr);
引數:cond:要初始化的條件變數
attr:null
2.銷毀:
int pthread_cond_destory(pthread_cond_t *cond);
3.等待條件滿足:
int pthread_cond_wait(pthread_cont_t *restrict cond,pthread_mutex_t *restrict mutex);
引數:cond:要在這個條件變數上等待
mutex:互斥量,後面詳細解釋
注意:
在執行等待操作時,其實完成了以下事情:
4.喚醒等待:
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);
當滿足條件之後,就要喚醒在條件變數下等待的執行緒
該函式在使用時,要注意:
**如下:
1 #include2 #include3 #include4 #include5 #include6
7 pthread_mutex_t lock;
8 pthread_cond_t cond;
9 10 void *route1(void *arg)
11 18 }
19 20 void *route2(void* arg)
21 28 }
29 30 int main()
31
執行結果如下:
倆個執行緒協同工作,互不影響
為什麼pthread_cond_wait需要互斥量?
執行緒同步與互斥
與多程序互動一樣,各個不同的執行緒之間也會存在資源的共享問題。為了解決多執行緒之間對資源訪問的同步和互斥問題,我們需要了解執行緒同步機制。第一種機制 互斥鎖 互斥鎖是一種簡單的加鎖方法,可以使單個執行緒進行對資源訪問的原子操作。互斥鎖的基本操作就是加鎖和解鎖。互斥鎖主要包含以下函式 1 初始化函式 ...
執行緒同步與互斥
1.執行緒互斥 執行緒互斥是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。同步就是協同步調,按預定的先後次序進行執行。如 你說完,我再說。同 字從字面上容易理解為一起動作 其實不是,同 字應是指協同 協助 互相配合。如程序 執行...
執行緒的同步與互斥
進行多執行緒程式設計,因為無法知道哪個執行緒會在哪個時候對共享資源進行操作,因此讓如何保護共享資源變得複雜,通過下面這些技術的使用,可以解決 執行緒之間對資源的競爭 1.互斥量mutex 2.訊號燈semaphore 3.條件變數 conditions mutex 互斥鎖線程控制 1 互斥鎖是用一種...