執行緒的同步與互斥

2021-08-19 14:22:32 字數 2669 閱讀 3829

下面看一段**:

#include 

#include

#include

#include

#include

int ticket = 100;

void *route(void *arg)

else

}}int main()

看著貌似沒什麼問題,但是請看執行結果:

pthread_mutex_t mutex =pthread_mutex_initializer
法2:動態分配

int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);

引數:mutex:要初始化的互斥量

attr:null

int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_lock(pthread_mutex_t *mutex);加鎖

int pthread_mutex_unlock(pthread_mutex_t *mutex);解鎖

改進上面的**:

#include 

#include

#include

#include

#include

#include

int ticket = 100;

pthread_mutex_t mutex;

void *route(void *arg)

else

}}int main()

可以看到執行結果和我們預想的一樣:

為了完成同步過程,我們引入條件變數:

int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);

引數:cond:要初始化的條件變數

attr:null

int pthread_cond_destroy(pthread_cond_t *cond)
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);

引數:cond:要在這個條件變數上等待

mutex:互斥量

1.必須有互斥鎖與它配合使用,這是為什麼呢??

a.條件等待是執行緒間同步的一種手段,如果只有乙個執行緒,條件不滿足,永遠等下去也不會滿足,所以必須要有乙個執行緒通過某些操作,改變共享變數,使原先不滿足的條件變得滿足,並通知等待在條件變數上的執行緒

b.條件不會無緣無故的突然就滿足了,必然會牽扯到共享資料的變化,所以要用互斥鎖來保護,沒有互斥鎖,就無法安全的獲取和修改共享資料

2.等的同時釋放鎖,如果不釋放就會造成死鎖問題,當signal或其它方式喚醒時要重新獲得鎖並從等待處繼續執行

pthread_mutex_lock(&mutex);

while(條件為假)

pthread_cond_wait(cond,mutex);

pthread_mutex_unlock(&mutex);

給條件傳送訊號

pthread_mutex_lock(&mutex);

設定條件為真

pthread_cond_signal(cond);

pthread_mutex_unlock(&mutex);

int pthread_cond_broadcast(pthread_cont_t *cond);喚醒一群

int pthread_cond_signal(pthread_cont_t *cond);喚醒單個

下面是乙個簡單的程式:

#include 

#include

#include

#include

#include

pthread_cond_t cond;

pthread_mutex_t mutex;

void *r1(void *arg)

}void *r2(void *arg)

}int main()

每隔1秒就會輸出乙個hello world:

執行緒同步與互斥

與多程序互動一樣,各個不同的執行緒之間也會存在資源的共享問題。為了解決多執行緒之間對資源訪問的同步和互斥問題,我們需要了解執行緒同步機制。第一種機制 互斥鎖 互斥鎖是一種簡單的加鎖方法,可以使單個執行緒進行對資源訪問的原子操作。互斥鎖的基本操作就是加鎖和解鎖。互斥鎖主要包含以下函式 1 初始化函式 ...

執行緒同步與互斥

1.執行緒互斥 執行緒互斥是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。同步就是協同步調,按預定的先後次序進行執行。如 你說完,我再說。同 字從字面上容易理解為一起動作 其實不是,同 字應是指協同 協助 互相配合。如程序 執行...

執行緒的同步與互斥

進行多執行緒程式設計,因為無法知道哪個執行緒會在哪個時候對共享資源進行操作,因此讓如何保護共享資源變得複雜,通過下面這些技術的使用,可以解決 執行緒之間對資源的競爭 1.互斥量mutex 2.訊號燈semaphore 3.條件變數 conditions mutex 互斥鎖線程控制 1 互斥鎖是用一種...