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时,依然会增加计数器的值 |