写者优先的写法:
读者优先:
#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;
}