這個樣例主要是利用管道實現進程同步
使用的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 和 |
||||||||||||
ReleaseSemaphore() | 釋放信號量 | HANDLE hSemaphore | 信號量句柄 | ||||||||||
LONG lReleaseCount |
釋放的數量, 一般完成一個等待後調用此函數釋放一個信號量,使得信號量平衡。 |
||||||||||||
LPLONG lpPreviousCount |
存放以前信號量的數量 , 一般可爲NULL. |
||||||||||||
OpenSemaphore() | 打開一個有名的信號量 | DWORD dwDesiredAccess |
對信號量的訪問權限, 可以是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;
}