CreateSemaphore

CreateSemaphore是Declare Function CreateSemaphore Lib "kernel32" Alias "CreateSemaphoreA" (lpSemaphoreAttributes AsSECURITY_ATTRIBUTES, ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As String) As Long。

基本介紹

  • 中文名:CreateSemaphore
  • 外文名:無
  • 解釋:創建一個新的信號量
  • 學科:計算機學
綜述,VB聲明,VC聲明,作用,返回值,參數,註解,詳細註解,

綜述

VB聲明

VC聲明

HANDLE CreateSemaphore(    LPSECURITY_ATTRIBUTESlpSemaphoreAttributes, // SD    LONGlInitialCount, // initial count    LONGlMaximumCount, // maximum count    LPCTSTRlpName// object name);

作用

創建一個新的信號量

返回值

Long,如執行成功,返回信號量對象的句柄;零表示出錯。會設定GetLastError。即使返回一個有效的句柄,但倘若它指出同名的一個信號量已經存在,那么GetLastError也會返回ERROR_ALREADY_EXISTS

參數

lpSemaphoreAttributes SECURITY_ATTRIBUTES,指定一個SECURITY_ATTRIBUTES結構,或傳遞零值(將參數聲明為ByVal As Long,並傳遞零值)——表示採用不允許繼承的默認描述符。該參數定義了信號量的安全特性
lInitialCount Long,設定信號量的初始計數。可設定零到lMaximumCount之間的一個值
lMaximumCount Long,設定信號量的最大計數
lpName String,指定信號量對象的名稱。用vbNullString可創建一個未命名信號量對象。如果已經存在擁有這個名字的一個信號量,就直接打開現成的信號量。這個名字可能不與一個現有的互斥體、事件、可等待計時器或檔案映射的名稱相符

註解

一旦不再需要,一定記住用CloseHandle關閉信號量的句柄。它的所有句柄都關閉以後,對象自己也會刪除
一旦值大於零,信號量就會觸發(發出信號)。ReleaseSemaphore函式的作用是增加信號量的計數。如果成功,就調用信號量上的一個等待函式來減少它的計數

詳細註解

Semaphore是另一個同步問題機制,不論是Event或Mutex,其他Process在執行WaitForSingleObject時,就看當時的對象是Signal或UnSignal而決定是否等待,而Semaphore也相同,但是它要變成Signal /UnSignal的狀態,卻有些不同,它是提供一個計數值,它允許在這個計數值之內,任何執行到WaitForSingleObject的Thread都不會停下來,而且每執行WaitForSingleObject一次,計數值就減一,當計數值變成0時,該Semaphore才會處於UnSignal的狀態,而某個Thread ReleaseSemaphore時,便會將計數值增加,以便其他的Thread或本身可得Signal的訊號,而使WaitForSingleObject停止等待。
例如說,該電腦只有兩個 COM PORT,所以只允許兩個計數值同時使用COM PORT,因此,
hSema = CreateSemaphore(ByVal 0&, 2, 2, "MySema")
第2個參數表示:剛開始的時候,有多少個COM PORT可使用
第3個參數表示:最多有多少個COM PORT可使用
第4個參數:Semaphore的名稱,只要名稱相同,則傳回的handle(hSema)會指向相同的Semaphore對象。
因此,要使用相同的名稱來Create Semaphore才能達共用一個Semaphore的效果。而使用
WaitForSingleObject來Check看看是否還有剩下的COM Port可使用,如果還有剩(計數值 > 0),則沒有
等待而可執行下一行指令,同時,計數值減1。若有第三個要求COM PORT的使用,那它就得等待,直到
有Thread執行ReleaseSemaphore(hSema, 1, count)
第2個參數表示:Release多少個COM PORT出來,一般來說都是1,表示一個ReleaseSemaphore
會將計數器的值加一,但是您也可以指定 > 1的值,代表一口氣增加計數器的值( + n , n > 1)。例如,您的程式一口氣使用了兩個COM PORT,並假設您於程式中有使用WaitForSingleObject兩次,程式最後,使用
ReleaseSemaphore(hSema, 2, count)而不必
ReleaseSemaphore(hSema, 1, count)執行兩次。
第3個參數表示:ReleaseSemaphore執行之前計數器原來的值。
Semaphore和Event有個地方相同,那就是沒有Owner的觀念,即Thread A 所Create出的
Semaphore對象,於Thread B中執行ReleaseSemaphore時,依然會增加計數器的值
示例:
write執行緒寫了之後,read1,read2,read3才能讀,且只有3個執行緒都讀完,write函式才能向buffer中寫。
下面是具體代碼:
#include<windows.h>#include<process.h>#include<iostream>using namespace std;CRITICAL_SECTION cs;typedef struct{    HANDLE h1;    HANDLE h2;    HANDLE h3;    HANDLE h4;    int a;}PARAMS,*PPARAMS;void read1(PVOID pvoid){    while(TRUE){        volatile PPARAMS pparams=(PPARAMS)pvoid;        WaitForSingleObject(pparams->h2,INFINITE);        EnterCriticalSection(&cs);        cout<<"讀執行緒1開始讀取...\n";        cout<<(pparams->a)<<endl;        LeaveCriticalSection(&cs);        Sleep(1000);        ReleaseSemaphore(pparams->h1,1,NULL);    }}void read2(PVOID pvoid){    while(TRUE){        volatile PPARAMS pparams=(PPARAMS)pvoid;        WaitForSingleObject(pparams->h3,INFINITE);        EnterCriticalSection(&cs);        cout<<"讀執行緒2開始讀取...\n";        cout<<(pparams->a)<<endl;        LeaveCriticalSection(&cs);        Sleep(1000);        ReleaseSemaphore(pparams->h1,1,NULL);    }}void read3(PVOID pvoid){    while(TRUE){        volatile PPARAMS pparams=(PPARAMS)pvoid;        WaitForSingleObject(pparams->h4,INFINITE);        EnterCriticalSection(&cs);        cout<<"讀執行緒3開始讀取...\n";        cout<<(pparams->a)<<endl;        LeaveCriticalSection(&cs);        Sleep(1000);        ReleaseSemaphore(pparams->h1,1,NULL);    }}void write(PVOID pvoid){    while(TRUE){        volatile PPARAMS pparams=(PPARAMS)pvoid;        WaitForSingleObject(pparams->h1,INFINITE);        WaitForSingleObject(pparams->h1,INFINITE);        WaitForSingleObject(pparams->h1,INFINITE);        cout<<"=================\n";        cout<<"寫執行緒開始寫入...\n";        pparams->a=rand()%256;        cout<<"寫入"<<(pparams->a)<<endl;        ReleaseSemaphore(pparams->h2,1,NULL);        ReleaseSemaphore(pparams->h3,1,NULL);        ReleaseSemaphore(pparams->h4,1,NULL);    }}int main(){    PARAMS params;    params.h1=CreateSemaphore(NULL,3,3,NULL);    params.h2=CreateSemaphore(NULL,0,1,NULL);    params.h3=CreateSemaphore(NULL,0,1,NULL);    params.h4=CreateSemaphore(NULL,0,1,NULL);    InitializeCriticalSection(&cs);    _beginthread(read1,0,&params);    _beginthread(read2,0,&params);    _beginthread(read3,0,&params);    _beginthread(write,0,&params);    //HANDLEhEvent;    //hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);    //WaitForSingleObject(hEvent,INFINITE);    int a;cin>>a;    DeleteCriticalSection(&cs);    return 0;}

相關詞條

熱門詞條

聯絡我們