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

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 项目练习

此节出一样品类来总结线程ACCESS控制部分

相关文章