HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // SD
LONG lInitialCount, // initial count
LONG lMaximumCount, // maximum count
LPCTSTR lpName // object name
)此函数可用来创建或打开一个信号量,先看参数说明: lpSemaphoreAttributes:为信号量的属性,一般可以设置为NULL lInitialCount:信号量初始值,必须大于等于0,而且小于等于 lpMaximumCount,如果lInitialCount 的初始值为0,则该信号量默认为unsignal状态,如果lInitialCount的初始值大于0,则该信号量默认为signal状态, lMaximumCount: 此值为设置信号量的最大值,必须大于0lpName:信号量的名字,长度不能超出MAX_PATH ,可设置为NULL,表示无名的信号量。当lpName不为空时,可创建有名的信号量,若当前信号量名与已存在的信号量的名字相同时,则该函数表示打开该信号量,这时参数lInitialCount 和 lMaximumCount 将被忽略。 函数调用成功返回信号量句柄。释放信号量函数:BOOL ReleaseSemaphore( HANDLE hSemaphore, // handle to semaphore LONG lReleaseCount, // count increment amount LPLONG lpPreviousCount // previous count);参数说明:hSemaphore:信号量句柄,lReleaseCount:释放的数量,一般完成一个等待后调用此函数释放一个信号量,使得信号量平衡。lpPreviousCount :存放以前信号量的数量 ,一般可为NULL.打开信号量函数: HANDLE OpenSemaphore(
DWORD dwDesiredAccess, // access
BOOL bInheritHandle, // inheritance option
LPCTSTR lpName// object name
);此函数打开一个有名的信号量参数说明:dwDesiredAccess:对信号量的访问权限,取值可以是SEMAPHORE_ALL_ACCESS,可对信号量执行尽可能多的操作;可以是SEMAPHORE_MODIFY_STATE,允许使用ReleaseSemaphore释放信号量,达到修改信号量;还可以是SYNCHRONIZE,用等待函数异步的等待信号量变为signal状态bInheritHandle:如果为true,信号量句柄可被继承,反之不可继承。lpName :信号量的名字。别忘了最后使用完成后用CloseHandle()关闭信号量句柄暂时API写到此为止,以后还有关信号量的函数,再继续添加。下面通过一个例子,来说明使用信号量来世线程同步的例子,要求创建三个线程,每个线程次打印十次ID,必须三个线程一次打印。注意:在使用WaitForSingleObject等待信号量句柄时,若信号量为signal状态,则wait过后信号量自动减1,直到使用ReleaseSemaphore释放信号量,信号量才可增加代码如下:说明:创建控制台程序。
#include "stdafx.h"#include
//创建三个信号量
hSM_1 = CreateSemaphore(NULL, 1, 1, L"A");//开始为signal状态 hSM_2 = CreateSemaphore(NULL, 0, 1, L"B");//开始为unsignal状态,等待hSM_1释放 hSM_3 = CreateSemaphore(NULL, 0, 1, L"C");//开始为unsignal状态,等待hSM_2
//创建三个线程
hThread_1 = CreateThread(NULL, 0, Thread_1, NULL, 0, NULL); hThread_2 = CreateThread(NULL, 0, Thread_2, NULL, 0, NULL); hThread_3 = CreateThread(NULL, 0, Thread_3, 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;}
运行结果: