多進程和多線程是系統執行多任務機制的重要手段,多任務同時進行自然少不了相互之間的通信工作。下面先將線程間的通信方式總結一下,便于大家對比學習。
首先來說線程間的通信。因為多個線程是共享進程的空間的,所以線程之間的通信比較簡單,主要是利用全局變量的方法。全局變量對進程內的的所有線程都是可見的,所以多個線程可以通過操作全局變量達到相互通信的效果。但是這也存在一個問題,就是“資源”的競爭。
這里所說的資源指的就是全局變量,正是因為這種競爭(因為多線程是同時運行的,而我們往往不會去控制線程運行的順序,不然也不會用多線程了),導致可一些我們不愿見到的結果,所以我們每個線程對全局變量的操作都希望是原子性的。
為了解決這個問題在線程見引入了三種同步互斥機制,分別是信號量,互斥鎖,條件變量。
具體的函數應用如下:
信號量
#include
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:信號量的初始化。
參數:
sem:就是信號量的標識符
pshared: 0, 表示該信號量用于線程之間的通信。
非0, 表示該信號量用于進程程之間的通信。
value:非負的整數,就是信號量的初值。
如果為0, 表示沒有資源。
int sem_wait(sem_t *sem);
功能:阻塞申請信號量資源, 當信號量的值等于0時,睡眠等待。
一旦申請成功,那么信號量的值就會被減1.
參數:sem:
int sem_trywait(sem_t *sem);
功能:非阻塞申請信號量資源,如果申請不到資源,那么該函數立刻返回。
int sem_post(sem_t *sem);
功能:釋放信號量資源
釋放成功,信號量的值加1.
int sem_getvalue(sem_t *sem, int *svalue);
功能:獲得當前信號量的值。
參數: sem, 指定要獲得的信號量
svalue, 用于保存獲得的信號量的值。
int sem_destroy(sem_t *sem);
功能:銷毀無名信號量。
線程互斥鎖
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
功能:產生一把鎖
參數:mutex: 線程鎖的標識符
attr: 設置線程鎖的屬性,通常為NULL。
pthread_mutex_t lock;
pthread_mutex_init(&lock, NULL);
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:上鎖, 阻塞等待,直到能夠得到這把鎖。
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:解鎖。
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:就是銷毀一把鎖。
條件變量:
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
功能:初始化條件變量。
參數: cond: 條件變量的標識符
atrr:條件變量的屬性,通常為NULL。
pthread_cond_t cond;
pthread_cond_init(&cond, NULL);
int pthread_cond_signal(pthread_cond_t *cond);
功能:就是給一個需要該條件變量的線程發送喚醒的信號。
int pthread_cond_broadcast(pthread_cond_t *cond);
功能:給所有需要該條件變量的線程都發送喚醒信號。
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
功能:就是導致線程睡眠在此函數上,直到有線程給它發送條件變量的喚醒信號。
參數:cond :需要改條件變量
mutex:就是一個鎖。
pthread_cond_wait():先將鎖解開,然后進入睡眠,當被喚醒的時候需要重新加鎖(如果此時得不到鎖,那么繼續睡眠)。
int pthread_cond_destroy(pthread_cond_t *cond);
功能:銷毀條件變量。
這些函數的具體用法在上課時候我們已經學過,不再做更為具體的介紹,希望同學們多加練習。這里主要是總結下三者的應用。
這三種機制中,信號量和條件變量屬于一種阻塞通知的機制。采用阻塞的方法,讓一個進程中只有一個線程能“順利執行”,執行完畢后再通知其他線程執行。而互斥鎖是典型的互斥機制,對資源加以保護,在這期間不允許其他現場對保護的內容進行讀寫操作。通過信號量和條件變量都可以實現經典的生產者消費者模式。