執行緒同步與互斥 互斥鎖(mutex)

2021-08-09 13:31:09 字數 2479 閱讀 7502

在多執行緒訪問共享資料的時候可能會發生衝突,例如:

/*衝突的例子*/

#include#include#include#includeint common_data=0;//公共資料

void increase_data(void* vptr)

return null;

}int main(void)

err=pthread_create(&tid2,null,(void*)increase_data,(void *)2);

if(err!=0)

pthread_join(tid1,null);

pthread_join(tid2,null);

return 0;

}

我們會觀察到:

資料完全亂套了,沒有得到預期的20。

和這個類似的還有乙個有趣的例子:

/*沒有加鎖但是沒有衝突的情況*/

#include#include#include#includeint common_data=0;//公共資料

void pthread1(void* arg);//第乙個執行緒

void pthread1(void* arg);//第二個執行緒

void pthread1(void* arg)

}void pthread2(void* arg)

}int main(void)

err=pthread_create(&tid2,null,(void*)pthread2,null);

if(err!=0)

pthread_join(tid1,null);

pthread_join(tid2,null);

return 0;

}

這個例子執行以後沒有衝突,這是為什麼呢?!在和同學討論並經過自己動手實踐以後證實,其實只要把迴圈次數增加,比如增加到10000000,還是會觀察到衝突的,如下圖:

也就是說,當資料量小的時候,執行速度較快,給人的錯覺是「順序」執行的,但是資料量一旦大起來,總有某次讀寫操作相互過不去......。然後common_data的值就亂了。這也體現了所謂「量變引起質變」吧。

(1)pthread_mutex_init

用來申請乙個互斥鎖。

例如:

pthread_mutex_t mutex;

pthread_mutex_init(&mutex,null);

第乙個引數傳入pthread_mutex_t型別的指標,第二個指定了需要的屬性,一般用null。

(2)pthread_mutex_lock

給**段加鎖。加鎖意味著當前只有這個鎖定這個**段的執行緒能夠執行它,如果其他執行緒要執行這些**,這些執行緒就會被掛起。

(3)pthread_mutex_trylock

功能同(2),但是這個函式是「嘗試加鎖」,也就是說如果加鎖失敗了,函式會立刻返回,執行緒繼續執行。

(4)pthread_mutex_unlock

解鎖(但鎖還在,區別下面的pthread_mutex_destroy),和(3)、(4)配合使用。

(5)pthread_mutex_destroy

徹底銷毀鎖,功能同解鎖,如果我們不再需要某個鎖了就可以銷毀它。

有了互斥鎖的機制,就可以解決剛才的衝突問題了:

/*沒有加鎖但是沒有衝突的情況*/

#include#include#include#includeint common_data=0;//公共資料

pthread_mutex_t mutex;

void pthread1(void* arg);//第乙個執行緒

void pthread1(void* arg);//第二個執行緒

void pthread1(void* arg)

}void pthread2(void* arg)

}int main(void)

err=pthread_create(&tid2,null,(void*)pthread2,null);

if(err!=0)

pthread_join(tid1,null);

pthread_join(tid2,null);

pthread_mutex_destroy(&mutex);//將鎖徹底銷毀

return 0;

}

執行效果:

這一次儘管執行次數很大,但是沒有衝突了,得到了預期的2000000。

執行緒同步與互斥 互斥鎖

在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...

執行緒同步與互斥 互斥鎖

在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...

Windows執行緒同步之互斥鎖(Mutex)

執行緒同步的方式和機制 臨界區 互斥區 事件 訊號量四種方式 臨界區 critical section 互斥量 mutex 訊號量 semaphore 事件 event 的區別 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。在任意時刻只允許乙個執行緒對共享資源進行...