读者优先 读者优先意味着当目前存在读进程的时候写进程会被无限延后执行,当不存在读进程的时候写进程才可以执行,可以简单的理解为“读进程插队”。 其中的wnutex,rmutex是信号量,使用PV操作(wait,signal),当然就这里而言看做互斥锁也是可以的。 我们简单的分析以下这个过程,当有一个读者的时候就把readercount加一,也...
用信号量实现,可先写出P/V操作的伪代码,再根据伪代码翻译C代码。 Windows 操作系统中信号量相关的Api有,CreateSemaphore、WaitForSingleObject、ReleaseSemaphore,分别对应创建信号量,P操作、V操作。 可先预先定义好宏,这样在后面写代码的时候就不需要关注 Windows 的具体实现细节了,直接使用P/V操作来编写代码。 写的时间...
1.2. 伪代码原理 1.3. 读写锁接口使用 / 代码 #include<iostream>#include<pthread.h>#include<unistd.h>#include<vector>#include<cstdlib>#include<ctime>// 共享资源intshared_data=0;// 读写锁pthread_rwlock_t rwlock;//没有对全局/静态变量静态初始化这一说// 读者线程函数void*Reader(void*arg){//...
写优先的伪代码 Read() 因为是写者优先,【见上图① 】Wait until no writers的 writer有两类,当前有写者正在执行写操作,还有 在等待队列有写者。这两种情况,读者都需要等待。 读者读完数据后,检查 并唤醒等待队列中的写者。【见上图②】,这里没有检查是否还有Reader的情况 ...
写者优先在读者写者问题中,如果总有读者进程进行读操作,会造成写者进程永 远都不能进行写操作读者优先,即所谓的写者饿死现象。给出读者写者问题的另一个 解决方案:即保证当有一个写者进程想写时,不允许读者进程再进入,直到写者写完为止,让我们先回顾
【伪代码如下】 semaphoreWmutex=1,Rmutex=1,Amutex=1,mutexAuth=0;intRcount=0; intwaitAuthCount=0; intauthFlag= voidreader()/读者进*/ { P(Amutex)//临界资源authFlag和waitAuthCount互斥 if(authFlag==0) { waitAuthCount++; p(mutexAuth); } V(Amutex) P(Rmutex);//临界资源Rcount互斥 if...
信号量代码实现(写者优先) 等待的写者不会一直处于阻塞状态:一旦写者就绪,其在队列中出队优先级一直高于读者。 作为作业,日后实现。 使用管程实现写者优先 读者需要等待:当前在写操作的写者与等待中的写者。 伪码表示 Basic structure:two methods Database::Read() { ...
【伪代码如下】 semaphore Wmutex=1, Rmutex=1 ,Amutex=1,mutexAuth=0; int Rcount = 0; int waitAuthCount=0; int authFlag=1; void reader() /*读者进程*/ { P(Amutex)//临界资源authFlag和waitAuthCount互斥 if (authFlag==0) { waitAuthCount++; p(mutexAuth); } V(Amutex) P(Rmutex)...
②写者优先:读写同时等,则读等写写后读。 ③无优先:先等先执行; 伪代码(读者优先):(完整代码见附录) int rdc = 0; //读者计数 semaphoredata,mutex; //两个信号量 handleReading, Writing; //两个事件 Reader {ReaderState("读者%d正在等...\n", GetCurrentThreadId);//读者等 P(Writing);//等待写...
读者优先: 读者进程执行: 无其他读者写者, 直接执行 有写者等, 但其他读者在读, 直接读 有写者写, 等待 写者进程执行: 无其他读写者, 直接执行 有其他读写者, 等待 伪代码描述: 写者优先(这个是我自己想出来的, 不是标准答案, 望指出错误): 读者进程执行: 如果此时没有写者