天天看點

poj 1182 食物鍊 (種類并查集) 多線程程式設計之線程同步互斥量

      pthread是 posix threads 的簡稱,是posix的線程标準。

         pthread線程同步指多個線程協調地,有序地同步使用共享資源。中講述到,多線程共享程序資源,一個線程通路共享資源需要一段完整地時間才能完成其讀寫操作,如果在這段時間内被其他線程打斷,就會産生各種不可預知的錯誤。協調線程按一定的規則,不受打擾地通路共享資源,保證正确性,這便是線程同步的出發點。

       互斥量,是最簡單的線程同步機制,也是最常用的同步政策。

     1.互斥量(mutex):

       互斥量是一種線程同步對象,“互斥”的含義是同一時刻隻能有一個線程獲得互斥量。一個互斥量對應一個共享資源,互斥量狀态:1.解鎖狀态意味着共享資源可用,2.加鎖狀态意味着共享資源不可用。

       一個線程需要使用共享資源時,使用thread_mutex_lock申請:1.當互斥量為解鎖狀态,則占用互斥量,并給互斥量加鎖,占用資源(互相量為加鎖狀态,其他線程不能使用互斥量并等待互斥量變為解鎖狀态),2.如果互斥量為加鎖狀态,則線程等待,直到互斥量為解鎖狀态(其他線程使用完共享資源後會解鎖互斥量,釋放資源)。

      2.互斥量基本函數: 

      #include <pthread.h>

初始化互斥量:

        int pthread_mutex_init(pthread_mutex *mutex,

                                                const pthread_mutexattr_t* mutexattr);

      該函數第一個參數為一個互斥量指針,第二個參數為互斥量屬性指針(一般設為null)。該函數将按照互斥量屬性對互斥量進行初始化。

互斥量加鎖:

      int pthread_mutex_lock(pthread_mutex *mutex);

      該函數申請一個互斥量并對其進行加鎖,使該互斥量對其他線程不可用,讓其他申請互斥量的線程等待。

互斥量解鎖:

        int pthread_mutex_unlock(pthread_mutex *mutex);

      該函數對互斥量進行解鎖操作,使該互斥量對其他線程可以。

銷毀互斥量:

        int pthread_mutex_destroy(pthread_mutex *mutex);

      該函數銷毀一個不再需要的互斥量,釋放系統資源。

           3.牛刀小試:

線程my_thread_1将共享資源字元串share寫成aaaaaaaa,線程my_thread_2則将其寫成eeeeeeee。

       不啟用互斥量的情況下,兩個線程對共享資源的通路是随機并且無規律,互相幹擾打斷,産生a和e混合的字元串,這顯然不是我們期望的結果。

       啟用互斥量(去掉注釋)情況下,互斥量機制其作用,兩個線程同步協調地通路共享資源share,産生aaaaaaaa或eeeeeeee字元串,符合我們的預期。 

         通過該示例,讀者可以直覺地感受到互斥量的作用,親身體會互斥量機制,同時能讓讀者了解互斥量的内在原理。

繼續閱讀