秒杀多线程第八篇 经典线程同步 信号量Semaphore
閱讀本篇之前推薦閱讀以下姊妹篇:
《秒殺多線程第四篇一個經(jīng)典的多線程同步問題》
《秒殺多線程第五篇經(jīng)典線程同步關(guān)鍵段CS》
《秒殺多線程第六篇經(jīng)典線程同步事件Event》
《秒殺多線程第七篇經(jīng)典線程同步互斥量Mutex》
?
前面介紹了關(guān)鍵段CS、事件Event、互斥量Mutex在經(jīng)典線程同步問題中的使用。本篇介紹用信號量Semaphore來解決這個問題。
首先也來看看如何使用信號量,信號量Semaphore常用有三個函數(shù),使用很方便。下面是這幾個函數(shù)的原型和使用說明。
第一個?CreateSemaphore
函數(shù)功能:創(chuàng)建信號量
函數(shù)原型:
HANDLE?CreateSemaphore(
??LPSECURITY_ATTRIBUTES?lpSemaphoreAttributes,
??LONG?lInitialCount,
??LONG?lMaximumCount,
??LPCTSTR?lpName
);
函數(shù)說明:
第一個參數(shù)表示安全控制,一般直接傳入NULL。
第二個參數(shù)表示初始資源數(shù)量。
第三個參數(shù)表示最大并發(fā)數(shù)量。
第四個參數(shù)表示信號量的名稱,傳入NULL表示匿名信號量。
?
第二個?OpenSemaphore
函數(shù)功能:打開信號量
函數(shù)原型:
HANDLE?OpenSemaphore(
??DWORD?dwDesiredAccess,
??BOOL?bInheritHandle,
??LPCTSTR?lpName
);
函數(shù)說明:
第一個參數(shù)表示訪問權(quán)限,對一般傳入SEMAPHORE_ALL_ACCESS。詳細解釋可以查看MSDN文檔。
第二個參數(shù)表示信號量句柄繼承性,一般傳入TRUE即可。
第三個參數(shù)表示名稱,不同進程中的各線程可以通過名稱來確保它們訪問同一個信號量。
?
第三個?ReleaseSemaphore
函數(shù)功能:遞增信號量的當前資源計數(shù)
函數(shù)原型:
BOOL?ReleaseSemaphore(
??HANDLE?hSemaphore,
??LONG?lReleaseCount,??
??LPLONG?lpPreviousCount?
);
函數(shù)說明:
第一個參數(shù)是信號量的句柄。
第二個參數(shù)表示增加個數(shù),必須大于0且不超過最大資源數(shù)量。
第三個參數(shù)可以用來傳出先前的資源計數(shù),設(shè)為NULL表示不需要傳出。
?
注意:當前資源數(shù)量大于0,表示信號量處于觸發(fā),等于0表示資源已經(jīng)耗盡故信號量處于末觸發(fā)。在對信號量調(diào)用等待函數(shù)時,等待函數(shù)會檢查信號量的當前資源計數(shù),如果大于0(即信號量處于觸發(fā)狀態(tài)),減1后返回讓調(diào)用線程繼續(xù)執(zhí)行。一個線程可以多次調(diào)用等待函數(shù)來減小信號量。?
?
最后一個 信號量的清理與銷毀
由于信號量是內(nèi)核對象,因此使用CloseHandle()就可以完成清理與銷毀了。
?
在經(jīng)典多線程問題中設(shè)置一個信號量和一個關(guān)鍵段。用信號量處理主線程與子線程的同步,用關(guān)鍵段來處理各子線程間的互斥。詳見代碼:
[cpp]?view plaincopy運行結(jié)果如下圖:
可以看出來,信號量也可以解決線程之間的同步問題。
?
由于信號量可以計算資源當前剩余量并根據(jù)當前剩余量與零比較來決定信號量是處于觸發(fā)狀態(tài)或是未觸發(fā)狀態(tài),因此信號量的應(yīng)用范圍相當廣泛。本系列的《秒殺多線程第十篇 生產(chǎn)者消費者問題》將再次使用它來解決線程同步問題,歡迎大家參閱。
?
至此,經(jīng)典線程同步問題全部結(jié)束了,下一篇《秒殺多線程第九篇?經(jīng)典多線程同步問題總結(jié)》將會對其作個總結(jié)以梳理各知識點。
?
轉(zhuǎn)載請標明出處,原文地址:http://blog.csdn.net/morewindows/article/details/7481609
如果覺得本文對您有幫助,請點擊‘頂’支持一下,您的支持是我寫作最大的動力,謝謝。
總結(jié)
以上是生活随笔為你收集整理的秒杀多线程第八篇 经典线程同步 信号量Semaphore的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 秒杀多线程第九篇 经典线程同步总结 关键
- 下一篇: 秒杀多线程第十一篇 读者写者问题