線程內通信(Windows 下) 有名管道

這個樣例主要是利用管道實現進程同步

 

 

使用的API 

函數名 功能說明 參數說明
CreateSemaphore() 創建一個信號量 LPSECURITY_ATTRIBUTES lpSemaphoreAttributes

信號量的屬性,

一般可以設置爲NULL

 LONG lInitialCount, 

信號量初始值,必須大於等於0,而且小於等於 lpMaximumCount,如果lInitialCount 的初始值爲0,

則該信號量默認爲unsignal狀態,如果lInitialCount的初始值大於0,則該信號量默認爲signal狀態,

LONG lInitialCount

設置信號量的最大值,

必須大於0

  LPCTSTR lpName 

信號量的名字,長度不能超出MAX_PATH ,

可設置爲NULL,表示無名的信號量。

當lpName不爲空時,可創建有名的信號量,

若當前信號量名與已存在的信號量的名字相同時,則該函數表示打開該信號量,這時參數lInitialCount 和
lMaximumCount 將被忽略。

 
 
ReleaseSemaphore() 釋放信號量 HANDLE  hSemaphore 信號量句柄
LONG  lReleaseCount

釋放的數量,

一般完成一個等待後調用此函數釋放一個信號量,使得信號量平衡。

LPLONG lpPreviousCount

存放以前信號量的數量 ,

一般可爲NULL.

   
     
OpenSemaphore() 打開一個有名的信號量 DWORD  dwDesiredAccess

對信號量的訪問權限,
取值可以是SEMAPHORE_ALL_ACCESS,可對信號量執行儘可能多的操作;

可以是SEMAPHORE_MODIFY_STATE,允許使用ReleaseSemaphore釋放信號量,

達到修改信號量;

還可以是SYNCHRONIZE,用等待函數異步的等待信號量變爲signal狀態

BOOL bInheritHandle 如果爲true,信號量句柄可被繼承,反之不可繼承。
  LPCTSTR lpName  信號量的名字
   
     
CloseHandle() 關閉一個信號 HANDLE   hSemaphore 信號量的名字
   
   
   

 

實例代碼: 

#include <stdio.h>
#include <windows.h>
/*


*/
DWORD WINAPI Thread_1(LPVOID param);
DWORD WINAPI Thread_2(LPVOID param);
DWORD WINAPI Thread_3(LPVOID param);

HANDLE  hSM_1;
HANDLE  hSM_2;
HANDLE  hSM_3;

HANDLE hThread_1;
HANDLE hThread_2;
HANDLE hThread_3;


int main(void)
{
    hSM_1 = CreateSemaphore(NULL, 1, 1, "A");//創建一個管道 
    hSM_2 = CreateSemaphore(NULL, 0, 1, "B");
    hSM_3 = CreateSemaphore(NULL, 0, 1, "C");

    hThread_1 = CreateThread(NULL, 0, Thread_1, NULL, 0, NULL);//創建一個線程 
    hThread_2 = CreateThread(NULL, 0, Thread_3, NULL, 0, NULL);
    hThread_3 = CreateThread(NULL, 0, Thread_2, NULL, 0, NULL);

    //等待三個線程都執行完
    WaitForSingleObject(hThread_1, INFINITE);
    WaitForSingleObject(hThread_2, INFINITE);
    WaitForSingleObject(hThread_3, INFINITE);
    //三個線程都執行完
    printf("\n\n\t main end \n");
    //關閉句柄
    CloseHandle(hThread_1);//沒有關閉就會一直留在系統中 
    CloseHandle(hThread_2);
    CloseHandle(hThread_3);

    CloseHandle(hSM_1);
    CloseHandle(hSM_2);
    CloseHandle(hSM_3);
    return 0;
}
DWORD WINAPI Thread_1(LPVOID param)
{
    for (int i = 0; i < 10; i ++)
    {
        DWORD dwWait = WaitForSingleObject(hSM_1, INFINITE);	//掛起線程 

        //每一個wait過後信號量的數量自動減1,這樣就達到了控制同步

        printf("A");
        ReleaseSemaphore(hSM_2, 1, NULL);
    }
    return 0;
}

DWORD WINAPI Thread_2(LPVOID param)
{
    for (int i = 0; i < 10; i ++)
    {
        WaitForSingleObject(hSM_2, INFINITE);
        printf("B");
        ReleaseSemaphore(hSM_3, 1, NULL);
    }
    return 0;
}

DWORD WINAPI Thread_3(LPVOID param)
{
    for (int i = 0; i < 10; i ++)
    {
        WaitForSingleObject(hSM_3, INFINITE);
        printf("C ");
        ReleaseSemaphore(hSM_1, 1, NULL);
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章