信号量适合维护一组资源。
信号量内部维护一个计数。创建一个信号量对象,可以设置其初始计数和最大计数。线程抢占成功(即完成等待),计数递减。当计数等于0,再来一个线程,那就会被挂起。线程释放信号量控制权的时候,计数递增。
// 创建
HANDLE CreateSemaphoreA(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 为信号量的属性,一般可以设置为NULL
LONG lInitialCount, // 信号量初始值,0,信号量默认为unsignal状态,大于0,该信号量默认为signal状态
LONG lMaximumCount, // 此值为设置信号量的最大值
// 信号量的名字,可设置为NULL,表示无名的信号量。
// 若当前信号量名与已存在的信号量的名字相同时,
// 则该函数表示打开该信号量,这时参数lInitialCount 和 lMaximumCount 将被忽略
LPCSTR lpName
);
// 释放
BOOL ReleaseSemaphore(
// 对信号量的访问权限
// SEMAPHORE_ALL_ACCESS,可对信号量执行尽可能多的操作;
// SEMAPHORE_MODIFY_STATE,允许使用ReleaseSemaphore释放信号量,达到修改信号量;
// SYNCHRONIZE,用等待函数异步的等待信号量变为signal状态
HANDLE hSemaphore, // 信号量句柄
LONG lReleaseCount, // 释放的数量
LPLONG lpPreviousCount // 存放以前信号量的数量 ,一般可为NULL.
);
// 打开一个已经存在的信号量
HANDLE OpenSemaphoreW(
DWORD dwDesiredAccess, //
BOOL bInheritHandle, // true,子进程能够继承句柄
LPCWSTR lpName // 指定信号量的名字
);
Demo:
svn://gitee.com/sudaidai/Knowledge_List_of_C
文件夹路径:WindowsAPI/Semaphore