信号量Semaphore

信号量适合维护一组资源。
信号量内部维护一个计数。创建一个信号量对象,可以设置其初始计数和最大计数。线程抢占成功(即完成等待),计数递减。当计数等于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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容