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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信号量使用入门

發布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信号量使用入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*演示如何使用semaphore進行互斥訪問說明: read1, read2, read3互斥訪問, write等三個read讀完后才能寫,通過信息量進行控制 */#include<windows.h> #include<process.h> #include<iostream>using namespace std;CRITICAL_SECTION cs; // critical section objecttypedef struct {HANDLE h1;HANDLE h2;HANDLE h3;HANDLE h4;int a; }PARAMS, *PPARAMS;void read1(PVOID pvoid) {while(TRUE){ volatile PPARAMS pparams=(PPARAMS)pvoid;WaitForSingleObject(pparams->h2, INFINITE);EnterCriticalSection(&cs);cout << "讀線程1開始讀取...\n";cout << (pparams->a) << endl;LeaveCriticalSection(&cs);Sleep(1000);ReleaseSemaphore(pparams->h1, 1, NULL); // increase count of h1} }void read2(PVOID pvoid) {while(TRUE){ volatile PPARAMS pparams=(PPARAMS)pvoid;WaitForSingleObject(pparams->h3, INFINITE);EnterCriticalSection(&cs);cout << "讀線程2開始讀取...\n";cout << (pparams->a) << endl;LeaveCriticalSection(&cs);Sleep(1000);ReleaseSemaphore(pparams->h1, 1, NULL);} }void read3(PVOID pvoid) {while(TRUE){ volatile PPARAMS pparams=(PPARAMS)pvoid;WaitForSingleObject(pparams->h4, INFINITE); // decrease count of h4EnterCriticalSection(&cs);cout << "讀線程3開始讀取...\n";cout << (pparams->a) << endl;LeaveCriticalSection(&cs);Sleep(1000);ReleaseSemaphore(pparams->h1, 1, NULL); // increase count of h1} }void write(PVOID pvoid) {while(TRUE){ volatile PPARAMS pparams=(PPARAMS)pvoid;WaitForSingleObject(pparams->h1, INFINITE); // decrease count of h1WaitForSingleObject(pparams->h1, INFINITE);WaitForSingleObject(pparams->h1, INFINITE);cout << "\n=================\n";cout << "寫線程開始寫入...\n";pparams->a = rand() % 256;cout << "寫入" << (pparams->a) << endl;ReleaseSemaphore(pparams->h2, 1, NULL); // increase count of h2ReleaseSemaphore(pparams->h3, 1, NULL);ReleaseSemaphore(pparams->h4, 1, NULL);} }int main() {PARAMS params;params.h1 = CreateSemaphore(NULL, 3, 3, NULL); // create semaphore1params.h2 = CreateSemaphore(NULL, 0, 1, NULL); // create semaphore2params.h3 = CreateSemaphore(NULL, 0, 1, NULL);params.h4 = CreateSemaphore(NULL, 0, 1, NULL);InitializeCriticalSection(&cs); // init critical section object_beginthread(read1, 0, ?ms); // create thread to execute read1()_beginthread(read2, 0, ?ms);_beginthread(read3, 0, ?ms);_beginthread(write, 0, ?ms);Sleep(10 * 1000); // sleep 10 seconds, waiting for the above threads to running,// or the main thread will quickly exit, then these sub-threads have no time to run// so you will see no outputDeleteCriticalSection(&cs);return 0; }/*程序運行情況:================= 寫線程開始寫入... 寫入41 讀線程2開始讀取... 41 讀線程1開始讀取... 41 讀線程3開始讀取... 41================= 寫線程開始寫入... 寫入35 讀線程1開始讀取... 35 讀線程3開始讀取... 35 讀線程2開始讀取... 35================= 寫線程開始寫入... 寫入190 讀線程1開始讀取... 190 讀線程3開始讀取... 190 讀線程2開始讀取... 190================= 寫線程開始寫入... 寫入132 讀線程1開始讀取... 132 讀線程3開始讀取... 132 讀線程2開始讀取... 132================= 寫線程開始寫入... 寫入225 讀線程1開始讀取... 225 讀線程3開始讀取... 225 讀線程2開始讀取... 225================= 寫線程開始寫入... 寫入108 讀線程1開始讀取... 108 讀線程3開始讀取... 108 讀線程2開始讀取... 108================= 寫線程開始寫入... 寫入214 讀線程1開始讀取... 214 讀線程3開始讀取... 214 讀線程2開始讀取... 214================= 寫線程開始寫入... 寫入174 讀線程2開始讀取... 174 讀線程1開始讀取... 174 讀線程3開始讀取... 174================= 寫線程開始寫入... 寫入82 讀線程1開始讀取... 82 讀線程3開始讀取... 82 讀線程2開始讀取... 82================= 寫線程開始寫入... 寫入144 讀線程3開始讀取... 144 讀線程2開始讀取... 144 讀線程1開始讀取... 144*/

總結

以上是生活随笔為你收集整理的信号量使用入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。