操作系统同步互斥经典问题——读者写者问题
读者优先
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
mutex mt, wsem;
int readcount = 0;
#define READ(a) cout << a << " is reading..." << endl;
#define FINISH(a) cout << a << " finished reading." << endl;
#define WRITE cout << "writing..." << endl;
void P(mutex &mt)
{
mt.lock();
}
void V(mutex &mt)
{
mt.unlock();
}
// 加入unistd.h出现问题,似乎与thread的兼容性比较差,于是重写
void delay()
{
int sum=0;
for(int i = 0; i < 10000000; i++)
sum += i
}
void read(string a)
{
for(int i = 0; i < 3; i++)
{
P(mt);
readcount++;
if(readcount == 1)
P(wsem);
V(mt);
READ(a);
delay();
P(mt);
readcount--;
FINISH(a);
if(readcount == 0)
V(wsem);
V(mt);
}
}
void write()
{
for(int i = 0; i < 5; i++)
{
P(wsem);
WRITE;
delay();
V(wsem);
}
}
int main()
{
thread reader1(read, "svtter");
thread reader2(read, "sr");
thread reader3(read, "yym");
thread reader4(read, "xiaoniu");
thread writer(write);
reader1.join();
reader2.join();
reader3.join();
reader4.join();
writer.join();
return 0;
}
写者优先
使rsem中只有一个读者在等待,保证了如果有写者,写者优先写。
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
#define READ(a,i) cout << a << i<<" is reading..." << endl;
#define FINR(a,i) cout << a << i<<" finished reading." << endl;
#define WRITE(a,i) cout << a <<i<<" is writing..." << endl;
#define FINW(a, i) cout << a <<i<<" finished writing..." << endl;
void P(mutex &mt)
{
mt.lock();
}
void V(mutex &mt)
{
mt.unlock();
}
// 加入unistd.h出现问题,似乎与thread的兼容性比较差,于是重写
void delay()
{
int sum=0;
for(int i = 0; i < 10000000; i++)
sum += i;
}
mutex mr, wsem, rsem, mrc, mwc;
int readcount = 0;
int writecount = 0;
void read(string a)
{
for(int i = 0; i < 5; i++)
{
P(mr);
P(rsem);
P(mrc);
readcount++;
if(readcount == 1)
P(wsem);
V(mrc);
V(rsem);
V(mr);
READ(a, i);
P(mrc);
FINR(a, i);
readcount--;
if(readcount == 0)
V(wsem);
V(mrc);
}
}
void write(string a)
{
for(int i = 0; i < 3; i++)
{
P(mwc);
writecount++;
if(writecount == 1)
P(rsem);
V(mwc);
P(wsem);
WRITE(a, i);
FINW(a, i);
V(wsem);
P(mwc);
writecount--;
if(writecount == 0)
V(rsem);
V(mwc);
}
}
int main()
{
thread reader1(read, "svtter");
thread writer1(write, "sr");
thread writer2(write, "zs");
thread writer3(write, "yym");
reader1.join();
writer1.join();
writer2.join();
writer3.join();
return 0;
}
:http://www.cnblogs.com/svitter/