信号量semaphore详解

时间:2022-02-13 15:13:49

在CSDN上看到MoreWindows关于多线程的专题觉得蛮不错的。不过写到互斥量之后就没有再更新了,觉得有点可惜了,索性就来个狗尾续貂,用抛砖引玉的形式续写一下后面的章节吧信号量semaphore详解

    信号量内核对象用来对资源计数。与其他所有内核对象相同,它们也包含一个使用计数,但它们还包含另外两个32位值:一个最大资源和一个当前资源计数。最大资源技术表示信号量可以控制的最大资源,当前资源技术表示当前可用资源。

信号量的规则如下:

     (1)如果当前资源计数大于0,那么信号量处于触发状态

      (2) 如果当前资源计数等于0,那么信号量属于未触发状态

     (3)系统绝对不会让当前资源计数变为负数

     (4)当前资源计数绝对不会大于最大资源计数

                                                                                                      -------摘自《Windows核心编程》

Semahpore主要用到四个函数:

第一个CreateSemaphore

函数功能:创建信号量

函数原型:

      HANDLE CreateSemaphore(

        PSECURITY_ATTRIBUTE psa,

        LONG lInitialCount,

        LONG lMaximumCount,

         PCTSTR pszName

         );

函数说明:

   psa 安全控制,一般传入NULL

    lInitialCount 设置信号量的初始计数

  lMaximumCount 设置信号量的最大计数

  lpName  指定信号量对象的名称

第二个OpenSemaphore

函数功能:为现有的一个已命名信号机对象创建一个新句柄

函数原型:

HANDLE OpenSemaphore(

DWORD  dwDesiredAccess,

BOOL bInheritHandle,

PCTSTR pszName

);

函数说明:

    dwDesiredAccess,下述常数之一:

  SEMAPHORE_ALL_ACCESS 要求对事件对象的完全访问;

  SEMAPHORE_MODIFY_STATE 允许使用ReleaseSemaphore函数;

  SYNCHRONIZE 允许同步使用信号机对象。

  bInheritHandle,如果允许子进程继承句柄,则设为TRUE。

  lpName,指定要打开的对象的名字。

第三个ReleaseSemaphore

函数功能:递增信号量的当前资源计数

函数原型:

HANDLE ReleaseSemaphore(

HANDLE hSemaphore,

LONG lReleaseCount,

PLONG plPreviousCount

);

函数说明:

     hSemaphore 信号量句柄

     lReleaseCount 把lReleaseCount的值增加到当前资源技术上

     plPreviousCount 返回当前资源计数的原始值

第四个CloseHandle

清理信号量CloseHandle() 

 

 

   用信号量解决专栏提出的那个线程同步的问题有点大材小用了,不过依然可以完善的解决。基本思想就是设置一个最大资源数为1的信号量,初始时资源为0,主线程CreadThread后调用WaitSingleObject来等待信号量触发,子线程启动后操作完成需要工作后调用ReleaseSemaphore函数,将资源数增加到1信号量被触发。当WaitSingleObject调用后,资源会减1,资源数重新变成0。

代码如下:

信号量semaphore详解


 运行结果如下图: