zoukankan      html  css  js  c++  java
  • 零基础逆向工程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 项目练习

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

  • 相关阅读:
    以最简单的方式讲HashMap
    Python获得百度统计API的数据并发送邮件
    Java反射,注解,以及动态代理
    LeetCode每天一题之两数之和
    记一次SSM项目小结(一)
    OpenStack配置串口显示虚机界面
    sqlalchemy外键和relationship查询
    sqlalchemy数据库分层操作
    数据库外键基础知识和操作(世界杯版)
    openstack ovs实现vlan组网
  • 原文地址:https://www.cnblogs.com/flatcc/p/7881759.html
Copyright © 2011-2022 走看看