信号量, 带计数器的事件_大宝在北京_百度空间
Semaphore是另一个同步问题机制,不论是Event或Mutex,其他Process在执WaitForSingleObject
时,就看当时的物件是Signal或UnSignal而决定是否等待,而Semaphore也相同,但是它
要变成Signal /UnSignal的状态,却有些不同,它是提供一个计数值,它允许在这个计数
值之内,任何执行到WaitForSingleObject的Thread都不会停下来,而且每执行
WaitForSingleObject一次,计数值就减一,当计数值变成0时,该Semaphore才会处於
UnSignal的状态,而某个Thread ReleaseSemaphore时,便会将计数值增加,以便其他的
Thread或本身可得Signal的讯号,而使WaitForSingleObject停止等待。

例如说,该电脑只有两个 COM PORT,所以只允许两个计数值同时使用COM PORT,因此,

     hSema = CreateSemaphore(ByVal 0&, 2, 2, "MySema")

第2个叁数表示:刚开始的时候,有多少个COM PORT可使用
第3个叁数表示:最多有多少个COM PORT可使用
第4个叁数:Semaphore的名称,只要名称相同,则传回的handle(hSema)会指向相同的
   Semaphore物件。因此,要使用相同的名称来Create Semaphore才能达共用
   一个Semaphore的效果。
而使用WaitForSingleObject来Check看看是否还有剩下的COM Port可使用,如果还有剩
(计数值 > 0),则没有等待而可执行下一行指令,同时,计数值减1。若有第三个要求
COM PORT的使用,那它就得等待,直到有Thread执行

     ReleaseSemaphore(hSema, 1, count)

第2个叁数表示:Release多少个COM PORT出来,一般来说都是1,表示一个ReleaseSemaphore
        会将计数器的值加一,但是您也可以指定 > 1的值,代表一口气增加计数器
        的值( + n , n > 1)。例如,您的程式一口气使用了两个COM PORT,并假设
        您於程式中有使用WaitForSingleObject两次,程式最後,使用
        ReleaseSemaphore(hSema, 2, count)而不必
        ReleaseSemaphore(hSema, 1, count)执行两次。
第3个叁数表示:ReleaseSemaphore执行之前计数器原来的值。

Semaphore和Event有个地方相同,那就是没有Owner的观念,即Thread A 所Create出的
Semaphore物件,於Thread B中执行ReleaseSemaphore时,依然会增加计数器的值


郑重声明:资讯 【信号量, 带计数器的事件_大宝在北京_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——