读者写者模型

来源:互联网 发布:dht网络标示怎么下载 编辑:程序博客网 时间:2024/05/24 00:44




写者优先的写法:



读者优先:

#include <Windows.h>#include <iostream>using namespace std;HANDLE g_RC_Mutex = NULL;HANDLE g_Mutex = NULL;int g_rc = 0;// 死锁???DWORD WINAPI Reader(){    while (true)    {        WaitForSingleObject(g_RC_Mutex, INFINITE);        g_rc += 1;        if (g_rc == 1)        {            //如果是第一个读者,那么限制写者的访问            cout << "第一个读者" << endl;            WaitForSingleObject(g_Mutex, INFINITE);        }        ReleaseMutex(g_RC_Mutex);        // 读数据        cout << "读数据" << endl;        WaitForSingleObject(g_RC_Mutex, INFINITE);        g_rc -= 1;        if (g_rc == 0)        {            //如果是最后一个读者,那么释放以供写者或读者访问            cout << "最后一个读者" << endl;            ReleaseMutex(g_Mutex);        }        ReleaseMutex(g_RC_Mutex);    }}DWORD WINAPI Writer(){    while (true)    {        WaitForSingleObject(g_Mutex, INFINITE);        // 写数据        cout << "  写数据" << endl;        ReleaseMutex(g_Mutex);    }}int main(){    g_RC_Mutex = CreateMutex(NULL, false, NULL);    g_Mutex = CreateMutex(NULL, false, NULL);    HANDLE hReader = NULL;    HANDLE hWriter = NULL;    for (int i = 0; i < 2; ++i)    {        hWriter = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Writer, NULL, 0, NULL);        hReader = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Reader, NULL, 0, NULL);    }    getchar();    return 0;}


写者优先:

#include <Windows.h>#include <iostream>using namespace std;HANDLE x = NULL; // x控制ReadCount的互斥访问,HANDLE y = NULL; // y控制WriteCount的互斥访问HANDLE z = NULL;HANDLE rsem = NULL;HANDLE wsem = NULL;  //rsem,wsem分别表示对读和写的互斥控制int ReadCount = 0;int WriteCount = 0;void Reader() {//    while (true)//    {        WaitForSingleObject(z, INFINITE);                       //z保证写跳过读,做到写优先            WaitForSingleObject(rsem, INFINITE);                    //控制对读的访问,如果有写者,那么此处不成功                WaitForSingleObject(x, INFINITE);                       //对RC的互斥控制                ReadCount++;                if(ReadCount == 1)                {                    WaitForSingleObject(wsem, INFINITE); //第一个读者出现后,锁住不让写                }                ReleaseMutex(x);            ReleaseMutex(rsem);                    //释放读的访问,以使其他读者进入        ReleaseMutex(z);        //读数据...        cout << "读数据" << endl;        WaitForSingleObject(x, INFINITE);        ReadCount--;        if(ReadCount == 0)        {            ReleaseMutex(wsem); //如果是最后一个读者,释放对写的信号        }        ReleaseMutex(x);//    }}void Writer() {//    while (true)//    {        WaitForSingleObject(y, INFINITE);        WriteCount++;        if(WriteCount == 1)        {            WaitForSingleObject(rsem, INFINITE);        }        ReleaseMutex(y);        WaitForSingleObject(wsem, INFINITE);        //写数据...        cout << "写数据" << endl;        ReleaseMutex(wsem);        WaitForSingleObject(y, INFINITE);        WriteCount--;        if(WriteCount == 0)        {            ReleaseMutex(rsem);        }        ReleaseMutex(y);//    }}int main(){    x = CreateMutex(NULL, false, NULL);    y = CreateMutex(NULL, false, NULL);    z = CreateMutex(NULL, false, NULL);    rsem = CreateMutex(NULL, false, NULL);    wsem = CreateMutex(NULL, false, NULL);    HANDLE hReader = NULL;    HANDLE hWriter = NULL;    for (int i = 0; i < 5; ++i)    {        hReader = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Reader, NULL, 0, NULL);        hWriter = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Writer, NULL, 0, NULL);        CloseHandle(hReader);        CloseHandle(hWriter);    }    getchar();    return 0;}








原创粉丝点击