taiyanghuatian 2017-06-22 01:32 采纳率: 0%
浏览 1183

进程调用怎么实现读者优先

我想模拟一下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;
}


  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2018-09-01 15:43
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题