線程的同步與互斥(上)

當多個線程同時訪問共享數據時就會有衝突,我們就需要控制訪問數據的線程,解決的辦法在這裏是引入——互斥鎖。

互斥鎖即Mutex,獲得鎖的線程可以完成自己的操作,然後釋放鎖給其他線程,沒有獲得鎖的線程只能等待而不能訪問共享數據。

當我們創建兩個線程,各自把count增加5000次,正常情況下最後count應該等於10000,但事實上每次運行該程序的結果都不一樣,有時候5000多,有時候又是6000多。

我們來看看程序及其運行結果:

我們可以清楚的看到結果,結果並不是我們所預期的10000,而是5181。

針對上述的問題,我們可以通過加鎖和解鎖來對數據進行保護,實現原子性的操作。先來認識幾個函數:

pthread_mutex_destroy是用來銷燬Mutex的,它的參數是線程tid取地址得到的。

pthread_mutex_init是用來初始化Mutex的,一般設置它的屬性attr爲缺省屬性NULL。

如果Mutex是靜態分配的,也可以用宏定義來初始化。

上述三個函數分別是用來給Mutex進行加鎖解鎖操作的。當申請加鎖失敗時,線程就會被掛起,知道unlock被調用時纔會被喚醒執行。

trylock函數允許多次申請,也允許申請互斥鎖失敗,這個函數會失敗返回EBUSY,而不會使線程掛起。

好,我們來解決上面的問題。代碼修改如下:

我們在其中加入了加鎖和解鎖的操作,再看看結果的變化:

結果達到了我們的預期,最終count的值爲10000。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章