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

大龍的博客

常用鏈接

統(tǒng)計

最新評論

信號量內(nèi)核對象

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


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

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

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

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

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

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

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

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

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

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

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


圖4 開始進入的兩個線程


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

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

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

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

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

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

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


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美视频一区在线| 国产精品久久久久久久9999| 老司机免费视频久久| 欧美天堂亚洲电影院在线播放| 国产日韩亚洲欧美| 亚洲美女在线看| 午夜精品一区二区三区在线| 国产日韩欧美精品在线| 亚洲一区二区在线播放| 久久人人97超碰精品888| 亚洲国产另类精品专区 | 夜夜嗨av一区二区三区中文字幕 | 麻豆精品精华液| 亚洲午夜激情| 欧美日本久久| 亚洲精品123区| 久久躁日日躁aaaaxxxx| 亚洲男人第一网站| 欧美新色视频| 亚洲天堂av电影| 亚洲精品在线观| 欧美激情国产高清| 亚洲激情黄色| 欧美大胆a视频| 免费黄网站欧美| 亚洲电影第1页| 久久综合国产精品台湾中文娱乐网| 亚洲香蕉伊综合在人在线视看| 欧美精品在线观看播放| 亚洲精选视频在线| 亚洲电影在线播放| 欧美aⅴ一区二区三区视频| 国产专区精品视频| 久久天天躁狠狠躁夜夜爽蜜月| 午夜精品久久久久久久蜜桃app | 一区二区免费在线观看| 亚洲激情在线播放| 欧美高潮视频| 99精品免费视频| 日韩视频精品在线| 欧美日韩综合一区| 亚洲在线视频免费观看| 一区二区三区久久| 国产精品久久久一区麻豆最新章节| 国产精品99久久久久久人| 99re热精品| 久久久成人精品| 先锋影音久久| 国产亚洲成精品久久| 欧美在线观看视频| 欧美一区二区精美| 在线 亚洲欧美在线综合一区| 久久在线免费观看| 欧美成人高清| 亚洲自拍偷拍一区| 性8sex亚洲区入口| 伊人成人在线| 最新成人av在线| 国产精品久久二区| 久久久噜噜噜久久中文字免| 久久婷婷综合激情| 一区二区三区产品免费精品久久75| 一本大道久久精品懂色aⅴ| 国产精品免费在线| 美日韩在线观看| 欧美激情四色 | 亚洲色诱最新| 一本一本久久| 欧美视频精品在线观看| 中日韩美女免费视频网址在线观看 | 国产精品区一区二区三区| 久久久五月天| 欧美日本网站| 浪潮色综合久久天堂| 欧美全黄视频| 久久亚洲春色中文字幕久久久 | 在线观看亚洲精品| 一区二区三区不卡视频在线观看| 国产无一区二区| 亚洲三级影院| 永久91嫩草亚洲精品人人| 99精品国产在热久久| 很黄很黄激情成人| 亚洲深夜激情| 最新国产成人在线观看| 亚洲欧美一区二区视频| 亚洲区国产区| 久久九九精品| 性久久久久久久久久久久| 欧美激情一区二区久久久| 一区二区三区欧美在线| 亚洲午夜一区二区| 韩国成人福利片在线播放| 一区二区三区欧美视频| 亚洲欧洲另类国产综合| 久久精品国产亚洲aⅴ| 亚洲免费在线电影| 欧美日一区二区在线观看| 欧美黄色网络| 国产精品久久毛片a| 久久精品亚洲一区二区三区浴池| 欧美—级在线免费片| 久久aⅴ国产紧身牛仔裤| 亚洲精品一区二区三区av| 99国产精品视频免费观看| 国产欧美韩日| 亚洲第一中文字幕在线观看| 国产精品激情偷乱一区二区∴| 亚洲国产成人tv| 国产三级精品三级| 日韩视频―中文字幕| 国内精品久久久久影院优| 亚洲国产欧洲综合997久久| 国产一区二区精品| 一本久久综合亚洲鲁鲁五月天| 激情欧美一区二区三区| 亚洲女女女同性video| 亚洲一区二区视频在线| 欧美精品综合| 亚洲国产你懂的| 精品不卡在线| 亚洲欧美日韩精品| 夜夜嗨av色一区二区不卡| 狼狼综合久久久久综合网| 久热国产精品| 国产亚洲视频在线观看| 性欧美精品高清| 久久综合中文| 日韩视频免费观看| 欧美丝袜一区二区| 亚洲女同精品视频| 久久这里有精品15一区二区三区| 精品福利免费观看| 欧美成人免费网| 一本色道久久综合亚洲91| 亚洲欧美日韩综合国产aⅴ| 国产人久久人人人人爽| 久久久www成人免费无遮挡大片 | 国内外成人免费激情在线视频| 久久成人资源| 亚洲国产1区| 亚洲女同精品视频| 国产真实精品久久二三区| 久久久久一本一区二区青青蜜月| 欧美插天视频在线播放| 一本在线高清不卡dvd| 国产精品女主播一区二区三区| 欧美一区二区精品在线| 欧美国产精品| 亚洲欧美一区二区三区在线 | 午夜精品久久久久久久蜜桃app| 久久亚洲不卡| 亚洲视频中文字幕| 激情成人中文字幕| 欧美日韩免费看| 久久成人一区| 一本大道av伊人久久综合| 老司机精品视频网站| 中文在线一区| 在线观看欧美一区| 国产伦精品一区二区三区免费 | 亚久久调教视频| 亚洲国产日韩欧美在线99| 欧美午夜一区二区福利视频| 欧美日韩亚洲天堂| 久久爱www久久做| 先锋亚洲精品| 亚洲人成网站777色婷婷| 国产精品久久久久久户外露出| 久久久久久久一区二区三区| 亚洲午夜女主播在线直播| 亚洲国产精品第一区二区| 久久久国产精品亚洲一区 | 日韩亚洲不卡在线| 狠狠色综合网| 国产精品日韩欧美大师| 免费观看成人www动漫视频| 亚洲午夜在线| 亚洲国产欧美在线| 欧美大片91| 久久综合久久综合久久综合| 亚洲影院免费| 在线亚洲一区二区| 亚洲人体影院| 亚洲国产免费| 狠狠色丁香久久婷婷综合丁香| 国产精品第十页| 欧美日韩网址| 欧美日韩一区二区欧美激情| 欧美婷婷六月丁香综合色| 国产精品jvid在线观看蜜臀 | 亚洲欧美日韩精品综合在线观看| 亚洲欧美激情诱惑| 欧美一区三区二区在线观看| 久久精品日韩| 欧美国产欧美亚州国产日韩mv天天看完整| 老鸭窝亚洲一区二区三区| 免费一区二区三区| 亚洲精品久久久久久一区二区| 99re6这里只有精品|