信号量使用入门
/*演示如何使用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*/
總結
- 上一篇: Mac UE各版本破解方法
- 下一篇: 政策推动加速5G发展 全球统一标准成大势