读书人

win32 pv操作 读者写者有关问题

发布时间: 2012-10-17 10:25:47 作者: rapoo

win32 pv操作 读者写者问题

p操作对应着WaitForSingleObject

v操作对应着ReleaseSemaphore

CRITICAL_SECTION就是临界区,你懂的

写者写一次,读者read1,read2,read3都读一次之后,write才能再次写。一下是win32源代码。例子比较简单,不过网上现成的例子貌似不太多,要有也是很杂乱的那种,所以写下来

#include<windows.h>#include<process.h>#include<iostream>using namespace std;CRITICAL_SECTION cs;typedef 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);    }}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);    EnterCriticalSection(&cs);    cout<<"读线程3开始读取...\n";    cout<<(pparams->a)<<endl;    LeaveCriticalSection(&cs);    Sleep(1000);    ReleaseSemaphore(pparams->h1,1,NULL);    }}void write(PVOID pvoid){    while(TRUE){    volatile PPARAMS pparams=(PPARAMS)pvoid;    WaitForSingleObject(pparams->h1,INFINITE);    WaitForSingleObject(pparams->h1,INFINITE);    WaitForSingleObject(pparams->h1,INFINITE);    cout<<"=================\n";    cout<<"写线程开始写入...\n";    pparams->a=rand()%256;    cout<<"写入"<<(pparams->a)<<endl;    ReleaseSemaphore(pparams->h2,1,NULL);    ReleaseSemaphore(pparams->h3,1,NULL);    ReleaseSemaphore(pparams->h4,1,NULL);    }}int main(){    PARAMS params;    params.h1=CreateSemaphore(NULL,3,3,NULL);    params.h2=CreateSemaphore(NULL,0,1,NULL);    params.h3=CreateSemaphore(NULL,0,1,NULL);    params.h4=CreateSemaphore(NULL,0,1,NULL);    InitializeCriticalSection(&cs);    _beginthread(read1,0,?ms);    _beginthread(read2,0,?ms);    _beginthread(read3,0,?ms);    _beginthread(write,0,?ms);//    HANDLE hEvent;//    hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);//    WaitForSingleObject(hEvent,INFINITE);    int a;cin>>a;    DeleteCriticalSection(&cs);    return 0;}


读书人网 >编程

热点推荐