1. 程式人生 > 實用技巧 >Linux多執行緒與多程序程式設計

Linux多執行緒與多程序程式設計

  1. 程序同步與互斥的區別?
  2. 程序的同步方式有哪些?
  3. 程序的通訊方式有哪些?
  4. 程序同步與通訊的區別是什麼?
  5. 執行緒的同步/通訊與程序的同步/通訊有區別嗎?

二、多執行緒的同步與互斥(互斥鎖、條件變數、讀寫鎖、自旋鎖、訊號量)

  1、同步與互斥的概念

  2、互斥鎖(同步)

  3、條件變數(同步)

  4、讀寫鎖(同步)

  5、自旋鎖(同步)

  6、訊號量(同步與互斥)

  

  1、同步與互斥的概念

  現代作業系統基本都是多工作業系統,即同時有大量可排程實體在執行。在多工作業系統中,同時執行的多個任務可能:

  • 都需要訪問/使用同一種資源
  • 多個任務之間有依賴關係,某個任務的執行依賴於另一個任務。

  【同步】:

  是指散步在不同任務之間的若干程式片斷,它們的執行必須嚴格按照規定的某種先後次序來執行,這種先後次序依賴於要完成的特定的任務。最基本的場景就是:兩個或兩個以上的程序或執行緒在執行過程中協同步調,按預定的先後次序執行。比如 A 任務的執行依賴於 B 任務產生的資料。

  【互斥】:

  是指散步在不同任務之間的若干程式片斷,當某個任務執行其中一個程式片段時,其它任務就不能執行它們之中的任一程式片段,只能等到該任務執行完這個程式片段後才可以執行。最基本的場景就是:一個公共資源同一時刻只能被一個程序或執行緒使用,多個程序或執行緒不能同時使用公共資源。

  2、互斥鎖(同步)

  在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時(還沒有列印完),別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,打印出來的東西肯定是錯亂的。
  線上程裡也有這麼一把鎖——互斥鎖(mutex),互斥鎖是一種簡單的加鎖的方法來控制對共享資源的訪問,互斥鎖只有兩種狀態,即上鎖( lock )和解鎖( unlock )。

  【互斥鎖的特點】:

  1.原子性:把一個互斥量鎖定為一個原子操作,這意味著作業系統(或pthread函式庫)保證瞭如果一個執行緒鎖定了一個互斥量,沒有其他執行緒在同一時間可以成功鎖定這個互斥量;

  2.唯一性:如果一個執行緒鎖定了一個互斥量,在它解除鎖定之前,沒有其他執行緒可以鎖定這個互斥量;

  3.非繁忙等待:如果一個執行緒已經鎖定了一個互斥量,第二個執行緒又試圖去鎖定這個互斥量,則第二個執行緒將被掛起(不佔用任何cpu資源),直到第一個執行緒解除對這個互斥量的鎖定為止,第二個執行緒則被喚醒並繼續執行,同時鎖定這個互斥量。

  【互斥鎖的操作流程如下】:

  1. 在訪問共享資源後臨界區域前,對互斥鎖進行加鎖;

  2. 在訪問完成後釋放互斥鎖導上的鎖。在訪問完成後釋放互斥鎖導上的鎖;

  3. 對互斥鎖進行加鎖後,任何其他試圖再次對互斥鎖加鎖的執行緒將會被阻塞,直到鎖被釋放。對互斥鎖進行加鎖後,任何其他試圖再次對互斥鎖加鎖的執行緒將會被阻塞,直到鎖被釋放。

 1 #include <pthread.h>
 2 #include <time.h>
 3 // 初始化一個互斥鎖。
 4 int pthread_mutex_init(pthread_mutex_t *mutex,  const pthread_mutexattr_t *attr);
 5 
 6 // 對互斥鎖上鎖,若互斥鎖已經上鎖,則呼叫者一直阻塞,
 7 // 直到互斥鎖解鎖後再上鎖。
 8 int pthread_mutex_lock(pthread_mutex_t *mutex);
 9 
10 // 呼叫該函式時,若互斥鎖未加鎖,則上鎖,返回 0;
11 // 若互斥鎖已加鎖,則函式直接返回失敗,即 EBUSY。
12 int pthread_mutex_trylock(pthread_mutex_t *mutex);
13 
14 // 當執行緒試圖獲取一個已加鎖的互斥量時,pthread_mutex_timedlock 互斥量
15 // 原語允許繫結執行緒阻塞時間。即非阻塞加鎖互斥量。
16 int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex,
17 const struct timespec *restrict abs_timeout);
18 
19 // 對指定的互斥鎖解鎖。
20 int pthread_mutex_unlock(pthread_mutex_t *mutex);
21 
22 // 銷燬指定的一個互斥鎖。互斥鎖在使用完畢後,
23 // 必須要對互斥鎖進行銷燬,以釋放資源。
24 int pthread_mutex_destroy(pthread_mutex_t *mutex);
View Code