1 信号量

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。[百度百科]

1.1 创建信号量

HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName
);

函数说明:

第一个参数表示安全控制,一般直接传入NULL。

第二个参数表示初始资源数量。0时不发送信号

第三个参数表示最大并发数量。lInitialCount<=lMaximumCount

第四个参数表示信号量的名称,传入NULL表示匿名信号量。

1.2 打开信号量

HANDLE OpenSemaphore(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
);

函数说明:

第一个参数表示访问权限,对一般传入SEMAPHORE_ALL_ACCESS。详细解释可以查看MSDN文档。

第二个参数表示信号量句柄继承性,一般传入FALSE即可。

第三个参数表示名称,不同进程中的各线程可以通过名称来确保它们访问同一个信号量。

1.3 递增信号量的当前资源计数

BOOL ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount
);

函数说明:

第一个参数是信号量的句柄。

第二个参数表示增加个数,必须大于0且不超过最大资源数量。

第三个参数返回当前资源数量的原始值,设为NULL表示不需要传出。

注:没有查询信标的当前资源数量值的函数

1.4 信号量的清理与销毁

CloseHandle();

1.5 信号量的应用

查MSDN

2 线程同步和线程控制

2.1 线程互斥

当多个线程访问同一个全局变量,或者同一个资源(比如打印机)的时候,需要进行线程间的互斥操作来保证访问的安全性.

临界区、互斥体、事件和信号量都可以实现线程互斥.但如果仅仅需要实现互斥功能,推荐前两种:

初始化 进入互斥区域 离开互斥区域 销毁
临界区 Initialize-CriticalSection Enter-CriticalSection Leave-CriticalSection DeleteCriticalSection
互斥体 CreateMutex WaitForSingleObject ReleaseMutex CloseHandle

两者的区别:

1、临界区只能用于进程内的线程互斥,性能较好.

2、互斥体属于内核对象,可以用于进程间的线程互斥,性能较差.

3、线程在没有正常退出互斥区而意外终结时,互斥体可以复位,但临界区不行.

2.2 线程同步

当有多个线程同时执行时,可能需要线程按照一定的顺序执行,比如:线程A负责将要处理的数据读取到内存中,而线程B负责分析这些数据,此时,应该是线程A执行完毕再执行线程B才有意义,这个时候就需要进行线程的同步控制。

可以用于线程同步控制的对象:事件和信号量

创建 使事件进入触发状态 使事件进入未触发状态 销毁
事件 CreateEvent SetEvent ResetEvent CloseHandle
信号量 CreateSemaphore WaitForSingleObject ReleaseSemaphore CloseHandle

两者的区别:

1、都是内核对象,使用完毕后应该关闭句柄.

2、信号量可以用于相当复杂的线程同步控制.

2.3 项目练习

此节有一项目来总结线程控制部分

最新文章

  1. 2016中国&#183;西安“华山杯”WriteUp- SeeSea
  2. ThinkPHP3.1.3源码分析---php文件压缩zlib.output_compression 和 ob_gzhandler
  3. Swift语法
  4. 自己写的一个jQuery轮播插件
  5. php干不了的活
  6. 与redmine对接
  7. 阿里巴巴的datasource
  8. Struts2(五)常量的配置
  9. Definition of matrix norms
  10. mysql查看编码格式以及修改编码格式
  11. Linux服务器定时健康检查,发生故障自动微信告警
  12. easywechat (在thinkphp5中使用easywechat完成微信网页认证)
  13. MySQL分布式jdbc连接
  14. Python import用法
  15. Installing PHP5 on Ubuntu Server
  16. KADEMLIA算法学习
  17. POJ 2656
  18. WhyEngine游戏引擎作品合集
  19. QOS-配置拥塞避免机制
  20. 【转】再谈PHP、Python与Ruby

热门文章

  1. 关于vue项目多页面的配置
  2. springboot结合swagger生成接口文档
  3. UncategorizedSQLException Mybatis中jdbcType的作用
  4. P2156 [SDOI2009]细胞探索
  5. 分布式通信框架RMI
  6. poi+properties文件实现多环境测试数据一键切换
  7. react 中文文档案例七 (温度计)
  8. N - 嘤嘤嘤 (并查集+枚举)
  9. 两个数据库通过DataTable实现差异传输
  10. sql replace()函数的用法