- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统-C语⾔实现读者写者问题 (写者优先)
同步互斥问题 - 读者写者问题之写者优先
问题要求:
读者-写者问题的读写操作限制(仅读者优先 写者优先) :
写-写互斥,即不能有两个写者同时进⾏写操作。
读-写互斥,即不能同时有⼀个线程在读,⽽另⼀个线程在写。
读-读允许,即可以有⼀个 多个读者在读。
写者优先的附加限制 :如果⼀个读者申请进⾏读操作时已有另⼀写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后
才能开始读操作。
写者优先实现思路 :
写者优先与读者优先类似。不同之处在于⼀旦⼀个写者到来,它应该尽快对⽂件进⾏写操作,如果有⼀个写者在等待,则新到来的读
者不允许进⾏读操作。为此应当添加⼀个整型变量write_count,⽤于记录正在等待的写者的数 ⽬,当write_count=0时,才可以释放
等待的读者线程队列。
为了对全局变量write_count实现互斥,必须增加⼀个互斥对象mutex2。
为了实现写者优先,应当添加⼀个临界区对象read,当有写者在写⽂件 等待时,读者必须阻塞在read上。同样,有读者读时,写者
必须等待。于是,必须有⼀个互斥对象RW_mutex来实现这个互斥。
有写者在写时,写者必须等待。
读者线程要对全局变量read_count实现操作上的互斥,必须有⼀个互斥对象命名为mutex 1。
实现代码 :
代码中信号量解析 :
设置五个信号量,分别是RWMutex, mutex 1, mutex2, mutex3, wrt,两个全局整型变量writeCount, readCount
信号量mutex 1在写者的进⼊区和退出区中使⽤,使得每次只有⼀个写者对其相应进⼊区 推出区进⾏操作,主要原因是进⼊区和退出
区存在对变量writeCount的修改,每个写者其进⼊区中writeCount加 1,退出区中writeCount减 1。信号量RWMutex则是读者和写
者两个之间的互斥信号量,保证每次只读 者只写。写者优先中,写者的操作应该优先于读者,则信号量⼀直被 占⽤着,直到没有写者
的时候才会释放,即当writeCount等于1的时候,申请信号量RWMutex ,其余的写者⽆需再次申请,但是写者是不能同时进⾏写操作
的,则需要设置⼀个信号量wrt来保证每次只有⼀个写者进⾏写操作,当写者的数量writeCount等于0的时候,则证明此时没有没有读
者了,释放信号量RWMutex。信号量mutex2防⽌⼀次多个读者修改readCount。当readCount为 1的时候,为阻⽌写者进⾏写操
作,申请信号量wrt,则写者就⽆法进⾏写操作了。信号量mutex3的主要⽤处就是避免写者同时与多个读者进⾏竞争,读者中信号量
RWMutex⽐mutex3先释放,则⼀旦有写者,写者可马上获得资源。
实现代码 :
/ *
* 写者优先
*/
# include stdio.h
# include stdlib.h
# include time.h
# include sys/types.h
# include pthread.h
# include semaphore.h
# include string.h
# include unistd.h
//semaphores
sem_t RWMutex mutex1 mutex2 mutex3 wrt ;
int writeCount readCount ;
struct data {
int id ;
int opTime;
int lastTime;
} ;
//读者
void* Reader(void* param) {
int id = ((struct data*)param)-id ;
int lastTime = ((struct data*)param)-lastTime;
int opTime = ((struct data*)param)-opTime;
sleep(opTime) ;
printf(Thread %d : waiting
文档评论(0)