青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

信號量內核對象

信號量(Semaphore)內核對象對線程的同步方式與前面幾種方法不同,它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目。在CreateSemaphore()創建信號量時即要同時指出允許的最大資源計數和當前可資源計數。一般是將當前可資源計數設置為最大資源計數,每增加一個線程對共享資源的訪問,當前可資源計數就會減1,只要當前可資源計數是大于0的,就可以發出信號量信號。但是當前可計數減小到0時則說明當前占資源的線程數已經達到了所允許的最大數目,不能在允許其他線程的進入,此時的信號量信號將無法發出。線程在處理完共享資源后,應在離開的同時通過ReleaseSemaphore()函數將當前可資源計數加1。在任何時候當前可資源計數決不可能大于最大資源計數。


圖3 使信號量對象控制資源

  下面結合圖例3來演示信號量對象對資源的控制。在圖3中,以箭頭和白色箭頭表示共享資源所允許的最大資源計數和當前可資源計數。初始如圖(a)所示,最大資源計數和當前可資源計數均為4,此后每增加一個對資源進行訪問的線程(黑色箭頭表示)當前資源計數就會相應減1,圖(b)即表示的在3個線程對共享資源進行訪問時的狀態。當進入線程數達到4個時,將如圖(c)所示,此時已達到最大資源計數,而當前可資源計數也已減到0,其他線程無法對共享資源進行訪問。在當前占有資源的線程處理完畢而退出后,將會釋放出空間,圖(d)已有兩個線程退出對資源的占有,當前可計數為2,可以再允許2個線程進入到對資源的處理。可以看出,信號量是通過計數來對線程訪問資源進行控制的,而實際上信號量確實也被稱作Dijkstra計數器。

  使信號量內核對象進行線程同步主要會CreateSemaphore()、OpenSemaphore()、ReleaseSemaphore()、WaitForSingleObject()和WaitForMultipleObjects()等函數。其中,CreateSemaphore()來創建一個信號量內核對象,其函數原型為:

HANDLE CreateSemaphore(
 LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 安全屬性指針
 LONG lInitialCount, // 初始計數
 LONG lMaximumCount, // 最大計數
 LPCTSTR lpName // 對象名指針
);

  參數lMaximumCount是一個有符號32位值,定義了允許的最大資源計數,最大取值不能超過4294967295。lpName參數可以為創建的信號量定義一個名字,由于其創建的是一個內核對象,因此在其他進程中可以通過該名字而得到此信號量。OpenSemaphore()函數即可來根據信號量名打開在其他進程中創建的信號量,函數原型如下:

HANDLE OpenSemaphore(
 DWORD dwDesiredAccess, // 訪問標志
 BOOL bInheritHandle, // 繼承標志
 LPCTSTR lpName // 信號量名
);

  在線程離開對共享資源的處理時,必須通過ReleaseSemaphore()來增加當前可資源計數。否則將會出現當前正在處理共享資源的實際線程數并沒有達到要限制的數值,而其他線程卻因為當前可資源計數為0而仍無法進入的情況。ReleaseSemaphore()的函數原型為:

BOOL ReleaseSemaphore(
 HANDLE hSemaphore, // 信號量句柄
 LONG lReleaseCount, // 計數遞增數量
 LPLONG lpPreviousCount // 先前計數
);

  該函數將lReleaseCount中的值添加給信號量的當前資源計數,一般將lReleaseCount設置為1,如果需要也可以設置其他的值。WaitForSingleObject()和WaitForMultipleObjects()主要在試圖進入共享資源的線程函數入口處,主要來判斷信號量的當前可資源計數是否允許本線程的進入。只有在當前可資源計數值大于0時,被監視的信號量內核對象才會得到通知。

  信號量的使特點使其更適于對Socket(套接字)程序中線程的同步。例如,網絡上的HTTP服務器要對同一時間內訪問同一頁面的戶數加以限制,這時可以為沒一個戶對服務器的頁面請求設置一個線程,而頁面則是待保護的共享資源,通過使信號量對線程的同步作可以確保在任一時刻無論有多少戶對某一頁面進行訪問,只有不大于設定的最大戶數目的線程能夠進行訪問,而其他的訪問企圖則被掛起,只有在有戶退出對此頁面的訪問后才有可能進入。下面給出的示例代碼即展示了類似的處理過程:

// 信號量對象句柄
HANDLE hSemaphore;
UINT ThreadProc15(LPVOID pParam)
{
 // 試圖進入信號量關口
 WaitForSingleObject(hSemaphore, INFINITE);
 // 線程任務處理
 AfxMessageBox("線程一正在執行!");
 // 釋放信號量計數
 ReleaseSemaphore(hSemaphore, 1, NULL);
 return 0;
}
UINT ThreadProc16(LPVOID pParam)
{
 // 試圖進入信號量關口
 WaitForSingleObject(hSemaphore, INFINITE);
 // 線程任務處理
 AfxMessageBox("線程二正在執行!");
 // 釋放信號量計數
 ReleaseSemaphore(hSemaphore, 1, NULL);
 return 0;
}
UINT ThreadProc17(LPVOID pParam)
{
 // 試圖進入信號量關口
 WaitForSingleObject(hSemaphore, INFINITE);
 // 線程任務處理
 AfxMessageBox("線程三正在執行!");
 // 釋放信號量計數
 ReleaseSemaphore(hSemaphore, 1, NULL);
 return 0;
}
……
void CSample08View::OnSemaphore()
{
 // 創建信號量對象
 hSemaphore = CreateSemaphore(NULL, 2, 2, NULL);
 // 開啟線程
 AfxBeginThread(ThreadProc15, NULL);
 AfxBeginThread(ThreadProc16, NULL);
 AfxBeginThread(ThreadProc17, NULL);
}


圖4 開始進入的兩個線程


圖5 線程二退出后線程三才得以進入

  上述代碼在開啟線程前首先創建了一個初始計數和最大資源計數均為2的信號量對象hSemaphore。即在同一時刻只允許2個線程進入由hSemaphore保護的共享資源。隨后開啟的三個線程均試圖訪問此共享資源,在前兩個線程試圖訪問共享資源時,由于hSemaphore的當前可資源計數分別為2和1,此時的hSemaphore是可以得到通知的,也就是說位于線程入口處的WaitForSingleObject()將立即返回,而在前兩個線程進入到保護區域后,hSemaphore的當前資源計數減少到0,hSemaphore將不再得到通知,WaitForSingleObject()將線程掛起。直到此前進入到保護區的線程退出后才能得以進入。圖4和圖5為上述代脈的運行結果。從實驗結果可以看出,信號量始終保持了同一時刻不超過2個線程的進入。

  在MFC中,通過CSemaphore類對信號量作了表述。該類只具有一個構造函數,可以構造一個信號量對象,并對初始資源計數、最大資源計數、對象名和安全屬性等進行初始化,其原型如下:

CSemaphore( LONG lInitialCount = 1, LONG lMaxCount = 1, LPCTSTR pstrName = NULL, LPSECURITY_ATTRIBUTES lpsaAttributes = NULL );

  在構造了CSemaphore類對象后,任何一個訪問受保護共享資源的線程都必須通過CSemaphore從父類CSyncObject類繼承得到的Lock()和UnLock()成員函數來訪問或釋放CSemaphore對象。與前面介紹的幾種通過MFC類保持線程同步的方法類似,通過CSemaphore類也可以將前面的線程同步代碼進行改寫,這兩種使信號量的線程同步方法無論是在實現原理上還是從實現結果上都是完全一致的。下面給出經MFC改寫后的信號量線程同步代碼:

// MFC信號量類對象
CSemaphore g_clsSemaphore(2, 2);
UINT ThreadProc24(LPVOID pParam)
{
 // 試圖進入信號量關口
 g_clsSemaphore.Lock();
 // 線程任務處理
 AfxMessageBox("線程一正在執行!");
 // 釋放信號量計數
 g_clsSemaphore.Unlock();
 return 0;
}
UINT ThreadProc25(LPVOID pParam)
{
 // 試圖進入信號量關口
 g_clsSemaphore.Lock();
 // 線程任務處理
 AfxMessageBox("線程二正在執行!");
 // 釋放信號量計數
 g_clsSemaphore.Unlock();
 return 0;
}
UINT ThreadProc26(LPVOID pParam)
{
 // 試圖進入信號量關口
 g_clsSemaphore.Lock();
 // 線程任務處理
 AfxMessageBox("線程三正在執行!");
 // 釋放信號量計數
 g_clsSemaphore.Unlock();
 return 0;
}
……
void CSample08View::OnSemaphoreMfc()
{
 // 開啟線程
 AfxBeginThread(ThreadProc24, NULL);
 AfxBeginThread(ThreadProc25, NULL);
 AfxBeginThread(ThreadProc26, NULL);
}

posted on 2008-07-30 17:44 大龍 閱讀(781) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲美女福利视频网站| 韩国成人精品a∨在线观看| 99国产精品久久| 91久久久一线二线三线品牌| 免费在线一区二区| 夜夜爽99久久国产综合精品女不卡| 欧美激情精品久久久六区热门 | 欧美在线free| 一区二区三区在线免费观看| 欧美大秀在线观看| 欧美福利网址| 欧美亚洲一区三区| 快射av在线播放一区| 日韩视频在线你懂得| 亚洲视频成人| 一区二区三区在线观看国产| 亚洲国语精品自产拍在线观看| 欧美日韩综合视频网址| 欧美淫片网站| 欧美www视频在线观看| 亚洲欧美另类国产| 久久米奇亚洲| 亚洲午夜免费视频| 久久精品一区二区三区中文字幕| 亚洲国产综合在线| 亚洲一区二区三区中文字幕在线 | 国产精品亚洲成人| 免费人成精品欧美精品| 欧美性猛片xxxx免费看久爱| 老鸭窝毛片一区二区三区| 欧美日韩精品一区二区在线播放| 久久激五月天综合精品| 欧美国产一区二区| 欧美激情精品久久久久久蜜臀 | 亚洲国产乱码最新视频| 国产精品一区一区| 亚洲欧洲精品一区二区三区波多野1战4 | 国产亚洲一区二区精品| 亚洲人成艺术| 精品不卡一区二区三区| 一本色道久久综合亚洲精品按摩 | 亚洲第一精品福利| 国产婷婷97碰碰久久人人蜜臀| 亚洲欧洲在线播放| 在线成人性视频| 亚洲欧美清纯在线制服| 日韩一区二区电影网| 久久久夜精品| 久久久久国产精品人| 国产精品视频成人| 日韩亚洲视频在线| 99在线精品观看| 蜜乳av另类精品一区二区| 久久久精品2019中文字幕神马| 欧美午夜剧场| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 国产精品夜夜夜| 日韩一本二本av| 日韩网站在线| 欧美激情a∨在线视频播放| 男人的天堂亚洲| 伊人婷婷欧美激情| 久久精品人人做人人综合| 欧美在线视频免费播放| 国产精品人成在线观看免费 | 欧美国产极速在线| 亚洲激情在线观看视频免费| 久久免费的精品国产v∧| 久久欧美中文字幕| 国模大胆一区二区三区| 久久高清福利视频| 久久亚洲精品一区| 在线播放豆国产99亚洲| 噜噜噜躁狠狠躁狠狠精品视频| 狼狼综合久久久久综合网 | 国产精品黄视频| 亚洲一品av免费观看| 欧美一区二区观看视频| 国产欧美日韩激情| 久久精品人人做人人综合| 嫩模写真一区二区三区三州| 亚洲欧洲日本国产| 中文日韩在线视频| 国产精品v欧美精品v日韩精品 | 久久精品成人一区二区三区| 国语自产精品视频在线看一大j8 | 欧美亚洲一区二区在线观看| 久久夜色撩人精品| 亚洲精品国产欧美| 欧美视频一区二区三区…| 亚洲综合色激情五月| 麻豆freexxxx性91精品| 日韩一区二区精品葵司在线| 欧美色欧美亚洲高清在线视频| 亚洲一区二区免费| 欧美gay视频激情| 在线一区免费观看| 国产一区二区三区在线观看网站| 美女成人午夜| 亚洲视频电影图片偷拍一区| 蘑菇福利视频一区播放| 亚洲一区二区少妇| 伊人久久男人天堂| 欧美视频在线观看免费网址| 久久精品官网| 日韩视频精品| 嫩草影视亚洲| 欧美在线免费观看亚洲| 亚洲日本视频| 国产亚洲精品久久久久婷婷瑜伽| 免费美女久久99| 亚洲欧美综合网| 亚洲精品久久嫩草网站秘色| 久久精品国产999大香线蕉| 夜夜嗨av一区二区三区网站四季av| 国产欧美日韩中文字幕在线| 欧美精品福利视频| 久久婷婷国产综合尤物精品| 国产精品99久久99久久久二8| 欧美黄色小视频| 久久精品国产v日韩v亚洲 | 亚洲国产高潮在线观看| 国产一区二区久久精品| 国产精品vvv| 欧美日韩国产美| 牛夜精品久久久久久久99黑人| 午夜精品福利视频| 亚洲视频一区二区免费在线观看| 亚洲高清免费在线| 裸体歌舞表演一区二区| 久久久久成人精品| 久久不射中文字幕| 欧美一区二区黄色| 欧美一区二区三区精品电影| 亚洲五月六月| 亚洲午夜久久久久久久久电影院| 亚洲精品中文字幕在线| 亚洲激情综合| 亚洲日本中文| 亚洲乱码国产乱码精品精| 亚洲成人资源| 亚洲国产成人精品女人久久久 | 欧美va亚洲va香蕉在线| 免费观看在线综合| 免费日韩一区二区| 免费亚洲网站| 亚洲国产精品传媒在线观看| 欧美高清在线视频观看不卡| 欧美成人午夜激情视频| 欧美激情在线免费观看| 亚洲成色最大综合在线| 欧美另类变人与禽xxxxx| 欧美精品综合| 欧美午夜激情视频| 国产精品一区二区在线| 国产丝袜一区二区三区| 精品成人在线视频| 亚洲国产日韩欧美在线动漫| 99视频国产精品免费观看| 在线一区二区三区四区| 欧美亚洲在线观看| 久久亚洲综合色| 亚洲国产成人av好男人在线观看| 亚洲人屁股眼子交8| 这里只有视频精品| 欧美一区二区三区久久精品茉莉花| 久久成人一区| 欧美精品综合| 国产欧美日韩在线观看| 在线不卡亚洲| 亚洲综合999| 久久综合综合久久综合| 亚洲免费av片| 欧美资源在线| 欧美日韩国产美| 狠狠色狠狠色综合日日五| 亚洲免费观看在线观看| 欧美有码在线视频| 91久久国产综合久久| 午夜精品久久99蜜桃的功能介绍| 蜜臀99久久精品久久久久久软件| 国产精品高潮呻吟久久| 亚洲国产精品123| 午夜精品久久久久久久| 欧美激情亚洲激情| 午夜精品区一区二区三| 欧美精品三级| 精品福利电影| 欧美在线免费一级片| 亚洲美女av网站| 老司机亚洲精品| 国产曰批免费观看久久久| 一区二区三区四区蜜桃| 欧美成人黄色小视频| 亚洲欧美变态国产另类| 欧美成人午夜激情| 国产一区二三区| 日韩视频永久免费| 欧美大片一区| 亚洲欧美视频一区二区三区|