PV 執行緒同步和多執行緒問題

2021-07-12 00:48:52 字數 1172 閱讀 1208

基於訊號量的執行緒同步問題,主要用到p和v操作

訊號量s是具有非負整數值的全域性變數,它只能由兩類特殊的操作來處理。這兩種操作分別稱為p和v;、

p(s)

如果當s是非0的,那麼p將s-1,並且立即返回。如果開始s就是0,那麼就掛起這個執行緒等待。

v(s)

將s加1,如果有執行緒阻塞在p操作等待s變為非0,v操作重啟這些執行緒中的乙個。

具體看乙個例子,加以理解,想象常用的執行緒加鎖的場景,

sem_t mutex;               //定義乙個mutex的鎖變數

sem_init(&mutex,0,1) //將鎖變數初始化為1

for(int i=0;i

考慮剛開始執行,此時第乙個執行緒開始執行,p(&mutex)它首先將mutex-1,因為初始時mutex是1,大於0,p操作將立刻返回,執行cnt++;都知道,在執行cnt++時,其實不是原子操作,它先將cnt的值拷貝進入暫存器,再暫存器值加1,再將暫存器的值拷回記憶體,完成加1操作,儘管時間很短,這還是需要時間的。此時,假設加1還未完全完成,另乙個執行緒想要執行了,它先執行p(&mutex),發現mutex本身就是0;沒有辦法,它只有掛起自己,等待。由此保證了cnt++操作不會被別的執行緒打擾,pv操作實現鎖的功能。在cnt++完成之後,v(&mutex)將mutex加1,使得mutex又變回1.同時,如果還有別的執行緒阻塞在p操作,正如我們剛剛說自己將自己掛起的那個執行緒。此時v操作可以重啟這些掛起的執行緒中的乙個。

一組併發的執行緒要訪問乙個共享物件,例如訪問乙個磁碟上的資料。有的執行緒唯讀物件,而有 的執行緒只修改物件,修改物件的執行緒叫做寫者,唯讀的執行緒叫做讀者。寫者必須擁有對物件獨佔的訪問,而讀者可以和無限其它的讀者共享物件。一般來說,有無數個併發的讀者和寫者。

讀者問題有幾個變種,分別是關於讀者的優先順序和寫者的優先順序的。第一類:讀者優先,如果有寫者,當前不讀。但是只要有乙個讀者再讀,不管有沒有寫者在等待,必須等到所有讀者讀完了才允許寫。第二種:寫者優先,要求一旦乙個寫者準備好可以寫,它就要盡快安排寫的操作。與第一類問題不同,在第乙個寫者到達後讀者必須等待,即使寫者也是在等待。

第一類讀者優先例項**,解釋下思路

int readcnt;

sem_t mutex,w;

void read(void)

}void write(void)

}

多執行緒PV

1 include 2 include 3 include stdafx.h 4 include beginthread endthread 5 include baseoperation.h 6 define n 10 78 typedef int semaphore 訊號量是一種特殊的整型變數 ...

多執行緒同步問題

在應用程式中使用多個執行緒的乙個好處是每個執行緒都可以非同步執行。對於 windows 應用程式,耗時的任務可以在後台執行,而使應用程式視窗和控制項保持響應。對於伺服器應用程式,多執行緒處理提供了用不同執行緒處理每個傳入請求的能力。否則,在完全滿足前乙個請求之前,將無法處理每個新請求。然而,執行緒的...

多執行緒同步問題

有四個執行緒1,2,3,4,執行緒1的功能就是輸出1,執行緒2的功能就是輸出2,以此類推.現在有四個檔案.abcd.初始都為空.現要讓四個檔案呈如下格式 a 1 2 3 4 1 2.b 2 3 4 1 2 3.c 3 4 1 2 3 4.d 4 1 2 3 4 1.設計程式.include sys ...