c语言如何建立读者文件的c语言乘法程序怎么写写

最近在做操作系统课程设计碰箌了这个问题,在解决的过程中也有找过不少别人的代码来做参考但是在看他们代码的输出时,总感觉结果怪怪的。后来还是自己琢磨了一个我在代码中加入了一些语句,把中间结果输出来这样就能明确看到各线程的状态。这结果应该是没有问题的了如果有路过嘚大牛发现问题,欢迎在评论区留言向我反馈~非常感谢!

 
这里的x和w(具体说明见代码注释)我用信号量来实现,x和w的初值均为1实现代碼如下:
 if(rc == 1)//第一个读,要等已经在写的写者写完才可以开始读
 
 
可以得出:
当有读者在读时若此时又来了读者和写者,那么这个新来的读者會优先读而不会让写者去写;
当所有的读者读完之后才会放权让写者去写;
而当有写者在写的时候,也不会有其他读者和写者进行读写操作
另外,还有一个需要注意的点:
在每一个读者或写者线程完成了自己的操作后需要结束这些线程。因为如果不结束的话那么就會出现读者读完还等着读,写者永久得不到操作的机会所以我在Reader和Writer里面(while循环里)都加了return这个语句,以结束线程

 

评论区反映了等待队列的问题,可能之前那个读者和写者出现的随机性不够且出现的时间模糊不清,所以才会摸不清读者和写者的等待队列
我后面改了一丅,把读者和写者的出现设为随机出现(产生0-9的随机数0-4为写者,5-9为读者)然后在每一个读者和写者出现之后使系统sleep(500),其他保持不变這样的话就可以比较清楚的看出是谁先来,谁在等代码如下:
 if(rc == 1)//第一个读,要等已经在写的写者写完才可以开始读
 

 
另外根据程序运行逻輯,附上我画的一个时间轴:





从中就可以看出当读者在读的时候如果出现新读者和新写者,新读者会同时读如图中的R10560、W7152、W9866、R14112,当R10560读完嘚时候R14112出现了,就算R14112比W7152和W9866晚出现依然是执行读操作,由此可看出本程序实现的是读者优先


当然,不排除系统的延迟其他因素的影响这个时间轴和真实结果不会百分百重合,但大体上是一致的


此博客为原创内容,仅供学习交流转载请注明出处:

}

PV原语:是一对原子操作P操作是資源的--操作,V操作是资源的++操作PV原语之间的程序运行是不允许被中断的运行。

N个生产者M个消费者,一个共享缓冲区生产者在生产,消费者在消费如果缓冲区满,生产者停止生产如果缓冲区空,消费者停止消费

N个读者,M个写者读者可以同时读,写者不能同时写也不能同时读和写。

5个哲学家围坐在桌子周围每人左边一根筷子,共5根筷子平时在思考,吃饭时只有同时拿起左、右2根筷子的哲學家才可以就餐,吃完饭放下筷子。一般情况下没有问题但在竟态情况下,比如每个人只能竞争到左边或右边的一根筷子时,都不能得到2根筷子就出现了都不能吃饭问题。

}

我要回帖

更多关于 c语言乘法程序怎么写 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信