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

大龍的博客

常用鏈接

統計

最新評論

信號量內核對象

信號量(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>
            亚洲桃色在线一区| 国自产拍偷拍福利精品免费一| 亚洲乱码国产乱码精品精天堂| 免费不卡视频| 老司机一区二区| 六月婷婷一区| 欧美激情第六页| 亚洲另类春色国产| 亚洲午夜一二三区视频| 亚洲综合另类| 久久久爽爽爽美女图片| 亚洲精品一区二区三区婷婷月| 性欧美暴力猛交69hd| 欧美在线观看一区| 蜜桃av综合| 欧美午夜不卡| 国产一区二区黄| 最新69国产成人精品视频免费| 一区二区日韩精品| 久久国产黑丝| 亚洲国内自拍| 在线视频日韩精品| 久久久久久久999精品视频| 欧美成人免费一级人片100| 国产精品户外野外| 亚洲国产成人久久综合| 亚洲专区国产精品| 亚洲国产导航| 欧美怡红院视频| 欧美日韩国产精品| 欲色影视综合吧| 欧美亚洲视频在线观看| 亚洲福利视频网| 久久精品国产欧美亚洲人人爽| 欧美精品一区视频| 在线观看欧美日韩| 欧美一级视频| 99视频精品在线| 久久这里有精品15一区二区三区| 国产精品护士白丝一区av| 亚洲国产精品久久久久秋霞影院| 欧美一区二区视频97| 日韩视频免费大全中文字幕| 久久综合中文| 伊人色综合久久天天| 午夜一区二区三视频在线观看| 亚洲国产福利在线| 久久综合亚洲社区| 狠狠综合久久av一区二区小说 | 伊人久久噜噜噜躁狠狠躁| 亚洲最黄网站| 亚洲人线精品午夜| 欧美不卡激情三级在线观看| 韩国三级电影一区二区| 新狼窝色av性久久久久久| 一本久久精品一区二区| 欧美精品日韩精品| 99精品国产在热久久下载| 男女精品网站| 免费精品99久久国产综合精品| 国产在线一区二区三区四区| 久久精精品视频| 欧美怡红院视频| 韩国av一区二区三区四区| 久久九九精品99国产精品| 亚洲欧美日韩精品久久奇米色影视| 欧美激情综合五月色丁香小说| 久久精品综合一区| 午夜伦理片一区| 亚洲天堂av在线免费| 欧美系列精品| 亚洲欧美成人精品| 亚洲欧美国产精品桃花| 国产欧美日韩另类一区| 久久国产精品久久久| 午夜伦欧美伦电影理论片| 国产精品成人久久久久| 艳妇臀荡乳欲伦亚洲一区| 亚洲国产小视频| 欧美日韩999| 欧美亚洲在线播放| 久久精精品视频| 亚洲区中文字幕| 洋洋av久久久久久久一区| 国产视频一区免费看| 麻豆精品视频在线观看视频| 欧美成人亚洲| 性欧美xxxx大乳国产app| 欧美专区日韩专区| 日韩视频免费观看高清在线视频 | 国产日韩精品在线播放| 久久综合图片| 欧美日韩国产成人| 久久精品国产96久久久香蕉| 麻豆国产精品va在线观看不卡| 99国产精品久久久| 性欧美xxxx大乳国产app| 亚洲国产精品va在线观看黑人| a4yy欧美一区二区三区| 国产一区二区三区的电影| 亚洲国产日韩在线| 国产视频观看一区| 91久久精品久久国产性色也91| 国产精品视频免费| 亚洲电影免费| 国产亚洲欧美日韩一区二区| 亚洲国内在线| 伊人婷婷欧美激情| 亚洲无毛电影| 亚洲免费播放| 久久精品在线免费观看| 一本久道综合久久精品| 久久久xxx| 欧美资源在线| 欧美视频二区| 最新亚洲视频| 亚洲国产欧美一区| 欧美资源在线观看| 欧美一区二区三区四区高清| 欧美精彩视频一区二区三区| 久久综合中文| 韩国成人精品a∨在线观看| 一区二区免费在线播放| 99re这里只有精品6| 美女日韩欧美| 免费短视频成人日韩| 国产一区二区三区不卡在线观看| 亚洲国产精品久久91精品| 欧美在线观看你懂的| 男女激情久久| 久久综合九色综合欧美就去吻| 欧美日韩一区二区视频在线观看| 欧美jizz19hd性欧美| 国产一区二区视频在线观看| 亚洲欧美在线免费| 欧美一区二区视频在线观看2020| 国产精品99免费看 | 亚洲精品视频在线观看免费| 国产亚洲一级高清| 亚洲一区二区欧美日韩| 亚洲一区二区三区四区视频| 欧美国产日产韩国视频| 欧美国产极速在线| 亚洲国产精品久久久久秋霞影院| 久久国产乱子精品免费女 | 国产最新精品精品你懂的| 午夜精品在线看| 欧美一区二区视频97| 国产丝袜一区二区| 欧美在线视频日韩| 猛干欧美女孩| 欧美人在线观看| 欧美专区在线| 激情六月综合| 欧美护士18xxxxhd| 中国日韩欧美久久久久久久久| 午夜视频在线观看一区二区| 国产欧美一区二区精品秋霞影院 | 久久人体大胆视频| 久久人人超碰| 亚洲高清视频在线观看| 免费久久99精品国产自| 亚洲日本成人在线观看| 亚洲欧美电影院| 一色屋精品视频在线观看网站| 免费国产一区二区| 一区二区三区精品视频| 久久国产一区二区| 亚洲第一天堂无码专区| 欧美日韩一区二区在线| 久久精品免视看| 最近中文字幕mv在线一区二区三区四区| 一本色道久久| 国产亚洲一区二区三区在线播放| 美女视频黄a大片欧美| 亚洲午夜在线观看| 老色鬼久久亚洲一区二区| 一个色综合av| 一区二区在线观看视频在线观看| 欧美日韩国产成人在线免费| 久久九九精品99国产精品| 亚洲精品久久久久久一区二区| 亚洲国产精品福利| 亚洲性xxxx| 玖玖在线精品| 在线亚洲美日韩| 伊人成年综合电影网| 欧美日本一道本| 欧美资源在线| 亚洲特黄一级片| 亚洲黄色av| 另类天堂视频在线观看| 性欧美videos另类喷潮| 洋洋av久久久久久久一区| 狠狠爱综合网| 国产日韩亚洲欧美精品| 国产精品大片| 欧美日韩xxxxx| 免费不卡视频| 久久婷婷综合激情|