對線程、互斥、同步、信號量的內在關聯性的簡單討論

多線程編程中,在一個程序中使用多線程,一般很少有多個線程能在其生命週期內進行完全獨立的操作。這些線程共享該進程空間的內存和文件句柄資源,多個線程競爭地獲得這些資源。爲了防止多個線程訪問資源的不一致性,就需要用到互斥量,互斥量本質上講就是一把鎖,該鎖保護一個或者一些資源。一個線程如果需要訪問該資源必須要獲得互斥量,並對其加鎖。這時如果其他線程如果想訪問該資源也必須要獲得該互斥量,但是鎖已經加鎖,所以這些進程只能阻塞,直到獲得該鎖的線程解鎖。這時阻塞的線程裏面有一個線程獲得該互斥量並加鎖,獲准訪問該資源。其他的線程繼續阻塞,周而復始。

說道互斥就必須說道同步。同步即是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。

要實現同步和互斥這種機制,就需要使用信號量。信號量中記錄着信號量的值和等待該信號量的進程隊列。對信號量進行p,v操作來對資源進行加鎖或釋放動作。

生產者消費者同步的理論模型:

1.   生產者進行生產將物品放入倉庫,同一時間只能有一個生產者將物品放入倉庫,如果倉庫滿,生產者等待。

2.   消費者從倉庫中取出物品,同一時間只能有一個消費者取出物品,如果倉庫空, 消費者等待;                  

3.   生產者將物品放入倉庫時消費者不能同時取;

4.   消費者取物品時生產者不能放入物品;

同步機制的關鍵僞代碼:

Producer---生產者進程Consumer---消費者進程

Buffer:array[0....k-1]   in,out:0...k-1 -----(數據類型:integerin記錄第一個空緩衝區,out記錄第一個不空的緩衝區)

S1,s2,mutex:semaphore (s1控制緩衝區不滿,s2控制緩衝區不空,mutex保護臨界區)

初始化:s1=k,s2=0,mutex=1

 

  本文只是對對線程、互斥、同步、信號量的簡單討論,其中大部分內容均是網絡收集的。

  更多關於多線程變成只是可以關注:開源文檔:http://docs.huihoo.com/

  關於本文可以參考:http://www.eygle.com/digest/2004/12/osprocess_lock_latchs_emaphores.html

 

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