Semaphore同步
生活随笔
收集整理的這篇文章主要介紹了
Semaphore同步
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
信號量和事件內核對象一樣,不會記錄當前擁有資源的線程ID,沒有線程占有權一說,信號量靠資源數量來進行同步,可用資源量等于0,代表信號量未激活,大于0,信號量被激活,并且允許資源數量個線程進入。
#include <iostream> #include <process.h> #include <windows.h> #include <string> using std::cout; using std::endl; using std::string;const int num=2; int count; HANDLE _Semaphore; unsigned __stdcall ThreadFun(void* par);int main() {count=0;HANDLE handles[num];//創建一個初始資源0,最大并發1的信號量_Semaphore=CreateSemaphore(NULL,0,1,NULL);for(int i=0;i<num;++i){handles[i]=(HANDLE)_beginthreadex(NULL,0,ThreadFun,NULL,0,0);//等待信號量可用資源數大于0(資源數大于0表示信號量處于觸發狀態) WaitForSingleObject(_Semaphore,INFINITE);}//等待所有線程執行完畢 WaitForMultipleObjects(num,handles,TRUE,INFINITE);for(int i=0;i<num;++i)CloseHandle(handles[i]);//關系信號量 CloseHandle(_Semaphore);system("PAUSE");return 0; } unsigned __stdcall ThreadFun(void* par) {for(int i=0;i<10;++i)cout<<"cout:"<<++count<<endl;count=0;//釋放一個資源,讓信號量的資源數加1(注意:這里輸出可能亂,只是為了觀察ReleaseSemaphore結果)cout<<"ReleaseSemaphore:"<<ReleaseSemaphore(_Semaphore,1,NULL)<<endl;return 0; }如果我們將代碼修改一下,一共有3個線程,并且信號量資源最大數為3,ReleaseSemaphore(_Semaphore,2,NULL)每次釋放遞增2個可用資源,那么結果就會不一樣,第一個線程輸出正常,然后遞增2個可用資源,剩下2個線程就可以順利執行,導致后面2個線程無法同步。
#include <iostream> #include <process.h> #include <windows.h> #include <string> using std::cout; using std::endl; using std::string;const int num=3; int count; HANDLE _Semaphore; unsigned __stdcall ThreadFun(void* par);int main() {count=0;HANDLE handles[num];//創建一個初始資源0,最大并發1的信號量_Semaphore=CreateSemaphore(NULL,0,3,NULL);for(int i=0;i<num;++i){handles[i]=(HANDLE)_beginthreadex(NULL,0,ThreadFun,NULL,0,0);//等待信號量可用資源數大于0(資源數大于0表示信號量處于觸發狀態) WaitForSingleObject(_Semaphore,INFINITE);}//等待所有線程執行完畢 WaitForMultipleObjects(num,handles,TRUE,INFINITE);for(int i=0;i<num;++i)CloseHandle(handles[i]);//關系信號量 CloseHandle(_Semaphore);system("PAUSE");return 0; } unsigned __stdcall ThreadFun(void* par) {for(int i=0;i<10;++i)cout<<"cout:"<<++count<<endl;count=0;//釋放一個資源,讓信號量的資源數加1(注意:這里輸出可能亂,只是為了觀察ReleaseSemaphore結果)cout<<"ReleaseSemaphore:"<<ReleaseSemaphore(_Semaphore,2,NULL)<<endl;return 0; }注意輸出結果,后面2個線程同步失敗
本文版權歸kennyMc和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
轉載于:https://www.cnblogs.com/kennyMc/archive/2012/12/15/2819620.html
總結
以上是生活随笔為你收集整理的Semaphore同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝被永久封钱怎么取出
- 下一篇: 快e付累计限额不足是什么意思