執行緒的同步與互斥

2021-08-22 19:23:43 字數 3150 閱讀 2584

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 互斥鎖是用一種...