读者写者问题----写者优先(python测试)

╰+哭是因爲堅強的太久メ 2023-06-06 12:10 37阅读 0赞

读者写者问题——写者优先(python测试)

  • 问题描述
  • 限制条件
  • 利用写者优先策略
  • 测试
    • 输出
  • 总结

问题描述

一个数据对象若被多个并发进程所共享,且其中一些进程只要求读该数据对象的内容,而另一些
进程则要求写操作,对此,把只想读的进程称为“读者”,而把要求写的进程称为“写者”。在
读者–写着问题中,任何时刻要求“写者”最多只允许有一个,而读者则允许有多个。因为多个
读者的行为互不干扰,他们只是读数据,而不改变数据对象的内容,而写者则不同,他们要改变数据对象的内容,如果他们同时操作,则数据对象的内容将会改变的不可知。

限制条件

  • 允许任意多的读进程同时读;
  • 一次只允许一个写进程写操作;
  • 如果有一个写进程正在进行写操作,禁止任何读进程进行读操作。

利用写者优先策略

即当一个写者到来时,只有那些已经获得授权允许读的进程才允许完成他们的操作,写者之后到来的读者将被推迟,直到写者完成。
为了解决“写着与写着”和“写着与第一个读者”的互斥问题即可,为此引入互斥信号量File。为了记录谁是第一个读者,可以用一个全局整型变量Rcount做一个计数器。而在解决问题的过程中,由于使用了全局变量Rcount,该变量又是一个临界资源,对于他的访问仍需互斥进行,所以需要一个互斥信号量Rmutex。记录等待与运行的写者数量引入一个全局变量Wcount,同时该变量又是一个临界资源,对于他的访问仍需互斥进行,所以需要一个互斥信号量Wmutex。

测试

  1. import time
  2. import threading
  3. from threading import Semaphore
  4. import random
  5. Rcount = 0 # 进行的读者队列数量
  6. Wcount = 0 # 进行的写者队列数量
  7. Wmutex = Semaphore(1) # 对临界资源Wcount的互斥访问
  8. Rmutex = Semaphore(1) # 对临界资源Rcount的互斥访问
  9. File = Semaphore(1) # 解决“写着与写着”和“写着与第一个读者”的互斥问题
  10. Wirte = Semaphore(1) # 表示写者进程
  11. def reader(i):
  12. print('reader'+str(i)+' waiting to read\n', end='')
  13. Wirte.acquire()
  14. Rmutex.acquire()
  15. global Rcount
  16. if Rcount == 0:
  17. File.acquire()
  18. Rcount += 1
  19. Rmutex.release()
  20. Wirte.release()
  21. print('reader'+str(i)+' reading\n', end='')
  22. time.sleep(random.randint(1, 5))
  23. print('reader'+str(i)+' finish read\n', end='')
  24. Rmutex.acquire()
  25. Rcount -= 1
  26. if Rcount == 0:
  27. File.release()
  28. Rmutex.release()
  29. def writer(i):
  30. print('writer'+str(i)+' waiting to write\n', end='')
  31. Wmutex.acquire()
  32. global Wcount
  33. if Wcount == 0:
  34. Wirte.acquire()
  35. Wcount += 1
  36. Wmutex.release()
  37. File.acquire()
  38. print('writer'+str(i)+' writing\n', end='')
  39. time.sleep(random.randint(1, 5))
  40. print('writer'+str(i)+' finish write\n', end='')
  41. File.release()
  42. Wmutex.acquire()
  43. Wcount -= 1
  44. if Wcount == 0:
  45. Wirte.release()
  46. Wmutex.release()
  47. if __name__ == '__main__':
  48. times = 10
  49. rwlist = []
  50. for _ in range(times):
  51. rwlist.append(random.randint(0, 1))
  52. print(rwlist)
  53. print('其中1表示读者进程,0表示写者进程')
  54. rindex = 1
  55. windex = 1
  56. for i in rwlist:
  57. if i == 1:
  58. t = threading.Thread(target=reader, args=(rindex, ))
  59. rindex += 1
  60. t.start()
  61. else:
  62. t = threading.Thread(target=writer, args=(windex, ))
  63. windex += 1
  64. t.start()

输出

  1. [1, 1, 1, 0, 0, 0, 1, 1, 0, 1]
  2. 其中1表示读者进程,0表示写者进程
  3. reader1 waiting to read
  4. reader1 reading
  5. reader2 waiting to read
  6. reader2 reading
  7. reader3 waiting to read
  8. reader3 reading
  9. writer1 waiting to write
  10. writer2 waiting to write
  11. writer3 waiting to write
  12. reader4 waiting to read
  13. reader5 waiting to read
  14. writer4 waiting to write
  15. reader6 waiting to read
  16. reader1 finish read
  17. reader3 finish read
  18. reader2 finish read
  19. writer1 writing
  20. writer1 finish write
  21. writer2 writing
  22. writer2 finish write
  23. writer3 writing
  24. writer3 finish write
  25. writer4 writing
  26. writer4 finish write
  27. reader4 reading
  28. reader5 reading
  29. reader6 reading
  30. reader4 finish read
  31. reader5 finish read
  32. reader6 finish read
  33. Process finished with exit code 0

总结

在该策略中,如果有一个不可中断的连续的写者,读者进程会被无限期的推迟。

发表评论

表情:
评论列表 (有 0 条评论,37人围观)

还没有评论,来说两句吧...

相关阅读

    相关 读者--问题

    读者--写者问题 问题描述 问题分析 如何实现 总结 问题描述 有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共

    相关 读者_模型

    一.读者\_写者模型 我们知道在一些程序中存在读者写者问题,就是对某些资源的访问会存在两种可能的情况:一种就是写操作,写操作是可以独占资源的,也就是具有排他性;另一种情况