零基础逆向工程38_Win32_12_信号量_线程控制小结

1 信号量

信号量(Semaphore),有时被称作信号灯,是在三多线程环境下利用的一种装备,是足以用来确保多个或七个第贰代码段不被冒出调用。[百度周全]

1.1 创造信号量

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

函数表明:
率先个参数表示安全控制,一般直接传入NULL。
第二个参数表示开始能源数量。0时不发送信号
其三个参数表示最大出现数量。lInitialCount<=l马克西姆umCount
第两个参数表示信号量的名目,传入NULL表示匿名信号量。

1.2 打开信号量

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

函数表达:
首先个参数表示访问权限,对一般传入SEMAPHORE_ALL_ACCESS。详细分解可以查阅MSDN文档。
第1个参数表示信号量句柄继承性,一般传入FALSE即可。
其几个参数表示名称,差异进度中的各线程可以因而名称来担保它们访问同二个信号量。

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

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

函数表达:
第1个参数是信号量的句柄。
第一个参数表示扩展个数,必须大于0且不超过最大财富数量。
其八个参数重回当前能源数量的原始值,设为NULL表示不要求传出。

注:从未有过查询信标的脚下能源数量值的函数

1.4 信号量的清理与销毁

CloseHandle();

1.5 信号量的行使

查MSDN

2 线程同步和线程控制

2.1 线程互斥

当多少个线程访问同1个全局变量,大概同3个财富(比如打印机)的时候,须要举办线程间的排挤操作来确保访问的平安性.

临界区、互斥体、事件和信号量都可以达成线程互斥.但借使一味须求贯彻互斥成效,推荐前三种:

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

相互的区分:
1、临界区不得不用于进度内的线程互斥,质量较好.
② 、互斥体属于基本对象,可以用于进度间的线程互斥,质量较差.
③ 、线程在并未健康退出互斥区而奇怪为止时,互斥体可以复位,但临界区不行.

2.2 线程同步

当有七个线程同时施行时,或者须求线程按照一定的次第执行,比如:线程A负责就要处理的多少读取到内存中,而线程B负责分析那些多少,此时,应该是线程A执行已毕再执行线程B才有含义,这些时候就要求开展线程的同步控制。

可以用来线程同步控制的目的:事件和信号量

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

双面的界别:
一 、都以水源对象,使用完成后应该关闭句柄.
二 、信号量可以用于12分复杂的线程同步控制.

2.3 项目练习

此节有一门类来总括线程控制部分

相关文章