我想模拟一下pv操作中的读者优先 按理来说进程随机调用 rcount(即读进程数目)应该也是随机的
而且我读进程有10个 写只有1个 应该大部分时间运行的都是读进程 为什么运行结果会是
读-写-读-写这样轮流呢?rcount一直为1
#include
#include
#include
#include
using namespace std;
unsigned short SIZE_OF_BUFFER; //文件长度
unsigned short rcount=0; //记录读者个数
HANDLE Mutex; //用于线程间的互斥
HANDLE Mutex1;
HANDLE RFile;
DWORD WINAPI Read(LPVOID); //读者线程
DWORD WINAPI Write(LPVOID); //写者线程
int main()
{
//创建各个互斥信号
//注意,互斥信号量和同步信号量的定义方法不同,互斥信号量调用的是 CreateMutex 函数,同步信号量调用的是 CreateSemaphore 函数,函数的返回值都是句柄。
Mutex = CreateMutex(NULL,FALSE,NULL); //互斥信号量,控制写者进入
RFile = CreateMutex(NULL,FALSE,NULL);
Mutex1 = CreateMutex(NULL,FALSE,NULL);
const unsigned short READS_COUNT = 10; //读者的个数
const unsigned short WRITES_COUNT = 1; //写者的个数
//总的线程数
const unsigned short THREADS_COUNT = READS_COUNT+WRITES_COUNT;
HANDLE hThreads[THREADS_COUNT]; //各线程的 handle
DWORD readID[READS_COUNT]; //读者线程的标识符
DWORD writeID[WRITES_COUNT]; //写者线程的标识符
//创建读者线程
for (int i=0;i<READS_COUNT;++i){
hThreads[i]=CreateThread(NULL,0,Read,NULL,0,&readID[i]);
if (hThreads[i]==NULL) return -1;
}
//创建写者线程
for (i=0;i<WRITES_COUNT;++i){
hThreads[WRITES_COUNT+i]=CreateThread(NULL,0,Write,NULL,0,&writeID[i]);
if (hThreads[i]==NULL)
return -1;
}
while(1)
{}
return 0;
}
//读者读数据
void read()
{
ifstream in("wr.txt");
string filename;
string line;
if(in) //有该文件
{
cout<<"当前有"<
cout";
while (getline (in, line)) // line中不包括每行的换行符
{
cout << line << endl;
}
}
else // 没有该文件
{
cout <<"no such file!\n" << endl;
}
}
//写者写数据
void write()
{
cout<<"write!-->";
string s;
cin>>s;
ofstream out;
out.open("wr.txt", ios::out);
if (out.is_open())
{
out<<s<<endl;
}
out.close();
}
//读者
DWORD WINAPI Read(LPVOID lpPara)
{
while(true){
WaitForSingleObject(RFile,INFINITE);
rcount += 1;
if(rcount==1)
{
WaitForSingleObject(Mutex1, INFINITE);
}
ReleaseSemaphore(RFile,1,NULL);
read();
Sleep(1500);
WaitForSingleObject(RFile,INFINITE);
rcount -= 1;
if(rcount==0)
{
ReleaseMutex(Mutex1);
}
ReleaseSemaphore(RFile,1,NULL);
}
return 0;
}
//写者
DWORD WINAPI Write(LPVOID lpPara)
{
while(true){
WaitForSingleObject(Mutex, INFINITE);
WaitForSingleObject(Mutex1, INFINITE);
write();
Sleep(1500);
ReleaseMutex(Mutex1);
ReleaseMutex(Mutex);
}
return 0;
}