读者写者问题(读者优先、写者优先、公平竞争)

守給你的承諾、 提交于 2019-12-24 00:53:53

读者优先:

1.写者、读者互斥访问文件资源。

2.多个读者可以同时访问文件资源。

3.只允许一个写者访问文件资源。


具体实现:

1.设置信号量fileSrc实现读写者对临界资源的访问。

2.设置计数器readCount来统计访问临界资源的读者数目,设置信号量readCountSignal完成对readCount计数器资源的互斥访问。

  1. /初始化读者队列为0,文件资源的初始值为1/
  2. int readCount = 0;
  3. semaphore readCountSignal = 1;
  4. reader()
  5. {
  6. while(true)
  7. {
  8. wait(readCountSignal); //申请读者队列计数器
  9. if(!readCount) //如果读者队列为空,申请文件资源
  10. wait(fileSrc);
  11. readCount++;
  12. signal(readCountSignal); //释放读者计数器资源
  13. perform read operation //执行临界区代码
  14. wait(readCountSignal); //申请读者计数器资源
  15. readCount–;
  16. if(!readCount) //如果读者队列为空,释放文件资源
  17. signal(fileSrc);
  18. signal(readCountSignal); //释放读者计数器资源
  19. }
  20. }
  21. writer()
  22. {
  23. while(true)
  24. {
  25. wait(file); //申请文件资源
  26. perform write operation //执行临界区代码
  27. signal(fileSrc); //释放文件资源
  28. }
  29. }
写者优先:

1.写者线程的优先级高于读者线程。

2.当有写者到来时应该阻塞读者线程的队列。

3.当有一个写者正在写时或在阻塞队列时应当阻塞读者进程的读操作,直到所有写者进程完成写操作时放开读者进程。

4.当没有写者进程时读者进程应该能够同时读取文件。


具体实现:

1.通过添加信号量read实现写者到来时能够打断读者进程。

2.设置信号量fileSrc实现读写者对临界资源的访问。

3.设置计数器writeCount来统计当前阻塞的写者进程的数目,设置信号量writeCountSignal完成对writeCount计数器资源的互斥访问。

4.设置计数器readCount来统计访问临界资源的读者数目,设置信号量readCountSignal完成对readCount计数器资源的互斥访问。

  1. /*初始化读者、写者队列为0,初始化令牌资源、读写计数器资源的初始值为1*/
  2. int readCount = 0;
  3. int writeCount = 0;
  4. semaphore read = 1;
  5. semaphore readCountSignal = 1;
  6. semaphore writeCountSignal = 1;
  7. reader()
  8. {
  9. while(true)
  10. {
  11. wait(read); //申请令牌
  12. wait(readCountSignal); //申请读者队列计数器
  13. if(!readCount) //如果读者队列为空,申请文件资源
  14. wait(fileSrc);
  15. readCount++;
  16. signal(readCountSignal); //释放读者计数器资源
  17. signal(read); //释放令牌
  18. ...
  19. perform read operation //执行临界区代码
  20. ...
  21. wait(readCountSignal); //申请读者计数器资源
  22. readCount--;
  23. if(!readCount) //如果读者队列为空,释放文件资源
  24. signal(fileSrc);
  25. signal(readCountSignal); //释放读者计数器资源
  26. }
  27. }
  28. writer()
  29. {
  30. while(true)
  31. {
  32. wait(writeCountSignal); //申请写者计数器资源
  33. if(!writeCount) //如果写者队列为空则申请令牌
  34. wait(read);
  35. writeCount++;
  36. signal(writeCountSignal); //释放写者计数器资源
  37. wait(file); //申请文件资源
  38. ...
  39. perform write operation //执行临界区代码
  40. ...
  41. signal(fileSrc); //释放文件资源
  42. wait(writeCountSignal); //申请写者计数器资源
  43. writeCount--;
  44. if(!writeCount) //如果写者队列为空则释放令牌
  45. signal(read);
  46. signal(writeCountSignal); //释放写者计数器资源
  47. }
  48. }

公平竞争:
1.优先级相同。
2.写者、读者互斥访问。
3.只能有一个写者访问临界区。
4.可以有多个读者同时访问临界资源。


具体实现:
1.设置file信号量实现对临界资源的互斥访问。
2.设置计数器readCount实现多个读者访问临界资源,通过设置信号量readCountSignal实现对readCount计数器的互斥访问。
3.设置信号量keySignal实现读者和写者的公平竞争(令牌)。
4.设置信号量OneSignal实现只有读者队列或写者阻塞在keySignal(对令牌资源的访问控制)。

  1. /* 读者队列初始值为0,其他资源初始值为1*/
  2. int readCount = 0;
  3. semaphore keySignal = 1;
  4. semaphore OneSignal = 1;
  5. semaphore readCountSignal = 1;
  6. reader()
  7. {
  8. while(true)
  9. {
  10. wait(keySignal); //申请令牌
  11. wait(readCountSignal); //申请计数器资源
  12. if(!readCount) //为零则申请文件资源
  13. wait(fileSrc);
  14. readCount++;
  15. signal(readCountSignal); //释放计数器资源
  16. signal(keySignale); //释放令牌
  17. ...
  18. perform read operation //执行临界区代码
  19. ...
  20. wait(readCountSignal); //申请计数器资源
  21. readCount--;
  22. if(!readCount) //为零则释放文件资源
  23. signal(fileSrc);
  24. signal(readCountSignal); //释放读者计数器资源
  25. }
  26. }
  27. writer()
  28. {
  29. while(true)
  30. {
  31. wait(OneSignal); //申请令牌资源
  32. wait(keySignal); //申请令牌
  33. wait(fileSrc); //申请文件资源
  34. ...
  35. perform write operation //执行临界区代码
  36. ...
  37. signal(fileSrc); //释放文件资源
  38. signal(keysignal); //释放令牌
  39. signal(OneSignal); //释放令牌资源
  40. }
  41. }


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!