VC++多線程同步(一)Mutex互斥量-創(chuàng)新互聯(lián)

一 、同步機制的引入目的是為了解決三個主要問題

主要從事網頁設計、PC網站建設(電腦版網站建設)、wap網站建設(手機版網站建設)、自適應網站建設、程序開發(fā)、微網站、重慶小程序開發(fā)公司等,憑借多年來在互聯(lián)網的打拼,我們在互聯(lián)網網站建設行業(yè)積累了豐富的網站設計制作、成都網站設計、網絡營銷經驗,集策劃、開發(fā)、設計、營銷、管理等多方位專業(yè)化運作于一體,具備承接不同規(guī)模與類型的建設項目的能力。

1為了控制線程之間共享資源的同步訪問,保證共享資源的完整性.(比如一個線程正在更新一個數(shù)據,而另外一個線程正在讀取該數(shù)據,那么就不知道該數(shù)據是新的還是舊的,為了避免這種狀況的發(fā)生)

2確保線程之間的動作,以制定的次序發(fā)送,例如一個線程的觸發(fā),需要另外一個線程的結果,作為條件。

3為了控制某一個共享資源的大訪問量,例如我們同時只能處理5個客戶的請求,這時候,我們需要放到隊列進行等待。

                 二、同步概念就是等待

WIN32  提供了API 等待函數(shù)

DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);

參數(shù)1 :hHandle對象句柄. 可以制定一系列的對象,如

Event(事件),Mutex(互斥),Seamphore(信號)Thread(線程)等

參數(shù)2:dwMilliseconds 定時時間間隔 單位milliseconds(毫秒)

1如果指定一個非零值,函數(shù)處于等待狀態(tài),直到hHandle標記的對象被觸發(fā),  或者時間到了.

2如果dwMilliseconds為0,對象沒有被觸發(fā)信號,函數(shù)不會進入一個等待狀態(tài),它立即返回.

3如果dwMilliseconds為INFINITE,對象被觸發(fā),信號,函數(shù)才會返回,大部分情況下只使用INFINITE這個宏.

這個函數(shù)是一個堵塞的函數(shù),意味著,只有這個函數(shù)運行完成才進行返回.因此他是一個同步的函數(shù).

返回值:

DWORD dw = WaitForSingleObject(hProcess,5000)

{

        //在指定之間內,代表等待成功,觸發(fā)了對象。

        case WAIT_OBJECT_0:

          //相應操作

        break;

        //等待時間結束,對象沒觸發(fā),沒有成功 說明超時了

      case WAIT_TIMEOUT:

          //相應操作

        break;

        //發(fā)生了一些錯誤 ,可以線程句柄是NULL

        case WAIT_FAILED:

        //相應操作

        break;

}

          三、Mutex互斥量對象(同步對象)

作用:

1 用于確保一個線程獨占對于一個資源的訪問

2 包含一個使用計數(shù)器,線程ID,以及一個遞歸計數(shù)

3 線程的id用來標識當前占用這個互斥量的是系統(tǒng)中的哪個線程

4 遞歸計數(shù)器表示這個線程占用該互斥量的次數(shù)

5 互斥量是使用最為頻繁的內核對象之一

主要是當某個共享資源被某個,線程進行加鎖操作后,其他的線程就無法訪問該資源,進行讀寫.

1創(chuàng)建互斥量對象:

CreateMutex函數(shù)功能是建立互斥體對象,返回的就是這個對象

HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, //指向安全屬性的指針

BOOL bInitialOwner //初始化互斥對象所有者

LPCTSTR lpName //指向互斥對象名的

)

參數(shù)1正常情況下使用NULL,如果我們使用跨進錯的訪問。

參數(shù)2 通常為FALSE,那么線程ID和遞歸計數(shù)器,都被設置為0.

參數(shù)3 指定互斥體對象名字,如果以及存在擁有這個,名字的一個事件,則打開現(xiàn)有的已命名互斥體,這個名字可能不予現(xiàn)有的事件,信號機,可等待計時器或文件映射相符。

通常用法:HANDLE Mutex = CreateMutex(NULL,FALSE,NUKL);

2釋放互斥量對象:

ReleaseMutex函數(shù)

BOOL WINAPI ReleaseMutex(

HANDLE hMutex);

hMutex: 互斥對象的句柄

作用:這個函數(shù)會將對象的遞歸計數(shù)器減1,如果線程成功的等待了互斥量對象不止一次,那么線程必須調用release相同的次數(shù)

才能使對象的遞歸計數(shù)器變?yōu)?.當遞歸計數(shù)器為0時,函數(shù)還將線程ID設為0,使互斥量處于觸發(fā)狀態(tài).

我們發(fā)現(xiàn)互斥量對象的遞歸計數(shù)器和id創(chuàng)建的時候就是0(也就是處于觸發(fā)狀態(tài)),那什么時候會增加使他非觸發(fā)狀態(tài).

3整個互斥量的操作流程:  (加鎖和解鎖流程)

假設:有一個全局的文件指針,同時又有多個線程,需要對該文件 指針進行讀寫,但是,為了保證資源的完整性,我們在同一時刻,

只允許一個線程進行讀寫操作。

加鎖:

為了獲得對被保護的資源的訪問權,線程要調用一個等待函數(shù)并轉入前面創(chuàng)建的互斥量句柄,在內部,等待函數(shù)會檢查線程ID是否為0(如果為0也就是觸發(fā)狀態(tài))如果為0,那么函數(shù)會把互斥量句柄中的線程ID設為當前調用線程的ID,(只有這個加鎖的線程,才

允許對資源進行讀寫訪問操作 。)并把遞歸計數(shù)器設為1,此時

互斥量就處于非觸發(fā)狀態(tài),對互斥量的線程id賦值和遞歸計數(shù)器增加,都是原子操作的,所謂的原子操作,就是指操作系統(tǒng)保證在完成原子操作之前,不進行線程的切換,然后當前線程繼續(xù)運行。

解鎖:

假設某一個線程成功的得到了互斥量,線程就知道自己獨占了對受保護的資源的訪問權, 那么任何視圖通過等待互斥量,來獲得

對資源的訪問權的線程,將進入等待狀態(tài),很重要的一點是:當線程進入等待狀態(tài)后,是不消耗Cpu時鐘頻率的.當獨占線程對資源

操作完后, 必須調用ReleaseMutex函數(shù)(釋放)來將互斥量的遞歸計數(shù)器減1 ,如果遞歸計數(shù)器的值為0的話,那么還會將線程id

設置為0,這樣互斥量又處于觸發(fā)狀態(tài)了。

互斥量的注意點:

1線程id和遞歸計數(shù)器遞增只能在wait(等待)函數(shù)中操作.

2必須要調用release函數(shù),否則會一直遞增導致死鎖。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

文章題目:VC++多線程同步(一)Mutex互斥量-創(chuàng)新互聯(lián)
當前網址:http://bm7419.com/article18/dpoedp.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供做網站、搜索引擎優(yōu)化、網站建設網頁設計公司、商城網站云服務器

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務器托管