日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Semaphore同步

發(fā)布時間:2024/10/12 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Semaphore同步 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

信號量和事件內(nèi)核對象一樣,不會記錄當(dāng)前擁有資源的線程ID,沒有線程占有權(quán)一說,信號量靠資源數(shù)量來進(jìn)行同步,可用資源量等于0,代表信號量未激活,大于0,信號量被激活,并且允許資源數(shù)量個線程進(jìn)入。

#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];//創(chuàng)建一個初始資源0,最大并發(fā)1的信號量_Semaphore=CreateSemaphore(NULL,0,1,NULL);for(int i=0;i<num;++i){handles[i]=(HANDLE)_beginthreadex(NULL,0,ThreadFun,NULL,0,0);//等待信號量可用資源數(shù)大于0(資源數(shù)大于0表示信號量處于觸發(fā)狀態(tài)) WaitForSingleObject(_Semaphore,INFINITE);}//等待所有線程執(zhí)行完畢 WaitForMultipleObjects(num,handles,TRUE,INFINITE);for(int i=0;i<num;++i)CloseHandle(handles[i]);//關(guān)系信號量 CloseHandle(_Semaphore);system("PAUSE");return 0; } unsigned __stdcall ThreadFun(void* par) {for(int i=0;i<10;++i)cout<<"cout:"<<++count<<endl;count=0;//釋放一個資源,讓信號量的資源數(shù)加1(注意:這里輸出可能亂,只是為了觀察ReleaseSemaphore結(jié)果)cout<<"ReleaseSemaphore:"<<ReleaseSemaphore(_Semaphore,1,NULL)<<endl;return 0; }

如果我們將代碼修改一下,一共有3個線程,并且信號量資源最大數(shù)為3,ReleaseSemaphore(_Semaphore,2,NULL)每次釋放遞增2個可用資源,那么結(jié)果就會不一樣,第一個線程輸出正常,然后遞增2個可用資源,剩下2個線程就可以順利執(zhí)行,導(dǎo)致后面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];//創(chuàng)建一個初始資源0,最大并發(fā)1的信號量_Semaphore=CreateSemaphore(NULL,0,3,NULL);for(int i=0;i<num;++i){handles[i]=(HANDLE)_beginthreadex(NULL,0,ThreadFun,NULL,0,0);//等待信號量可用資源數(shù)大于0(資源數(shù)大于0表示信號量處于觸發(fā)狀態(tài)) WaitForSingleObject(_Semaphore,INFINITE);}//等待所有線程執(zhí)行完畢 WaitForMultipleObjects(num,handles,TRUE,INFINITE);for(int i=0;i<num;++i)CloseHandle(handles[i]);//關(guān)系信號量 CloseHandle(_Semaphore);system("PAUSE");return 0; } unsigned __stdcall ThreadFun(void* par) {for(int i=0;i<10;++i)cout<<"cout:"<<++count<<endl;count=0;//釋放一個資源,讓信號量的資源數(shù)加1(注意:這里輸出可能亂,只是為了觀察ReleaseSemaphore結(jié)果)cout<<"ReleaseSemaphore:"<<ReleaseSemaphore(_Semaphore,2,NULL)<<endl;return 0; }

注意輸出結(jié)果,后面2個線程同步失敗

本文版權(quán)歸kennyMc和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

轉(zhuǎn)載于:https://www.cnblogs.com/kennyMc/archive/2012/12/15/2819620.html

總結(jié)

以上是生活随笔為你收集整理的Semaphore同步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。