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

逃离我推掉我的手 2023-06-06 10:47 66阅读 0赞

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

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

问题描述

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

限制条件

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

利用读者优先策略

当读者进行读时,后续的写者必须等待,直到所有的读者均离开后,写着才可进入。
为了解决“写着与写着”和“写着与第一个读者”的互斥问题即可,为此引入互斥信号量Wmutex。为了记录谁是第一个读者,可以用一个全局整型变量Rcount做一个计数器。而在解决问题的过程中,由于使用了全局变量Rcount,该变量又是一个临界资源,对于他的访问仍需互斥进行,所以需要一个互斥信号量Rmutex。

测试

  1. import time
  2. import threading
  3. from threading import Semaphore
  4. import random
  5. Wmutex = Semaphore(1)
  6. Rmutex = Semaphore(1)
  7. Rcount = 0
  8. sleept = 1
  9. def reader(i):
  10. print('reader'+str(i)+' waiting to read\n', end='')
  11. Rmutex.acquire()
  12. global Rcount
  13. if Rcount == 0:
  14. Wmutex.acquire()
  15. Rcount += 1
  16. Rmutex.release()
  17. print('reader'+str(i)+' reading\n', end='')
  18. time.sleep(sleept)
  19. print('reader'+str(i)+' finish read\n', end='')
  20. Rmutex.acquire()
  21. Rcount -= 1
  22. if Rcount == 0:
  23. Wmutex.release()
  24. Rmutex.release()
  25. def writer(i):
  26. print('writer'+str(i)+' waiting to write\n', end='')
  27. Wmutex.acquire()
  28. print('writer'+str(i)+' writing\n', end='')
  29. time.sleep(sleept)
  30. print('writer'+str(i)+' finish write\n', end='')
  31. Wmutex.release()
  32. if __name__ == '__main__':
  33. times = 10
  34. rwlist = []
  35. for _ in range(times):
  36. rwlist.append(random.randint(0, 1))
  37. print(rwlist)
  38. rindex = 1
  39. windex = 1
  40. for i in rwlist:
  41. if i == 1:
  42. t = threading.Thread(target=reader, args=(rindex, ))
  43. rindex += 1
  44. t.start()
  45. else:
  46. t = threading.Thread(target=writer, args=(windex, ))
  47. windex += 1
  48. t.start()

输出

  1. [1, 1, 0, 1, 1, 1, 1, 1, 1, 1]
  2. reader1 waiting to read
  3. reader1 reading
  4. reader2 waiting to read
  5. reader2 reading
  6. writer1 waiting to write
  7. reader3 waiting to read
  8. reader3 reading
  9. reader4 waiting to read
  10. reader4 reading
  11. reader5 waiting to read
  12. reader5 reading
  13. reader6 waiting to read
  14. reader6 reading
  15. reader7 waiting to read
  16. reader7 reading
  17. reader8 waiting to read
  18. reader8 reading
  19. reader9 waiting to read
  20. reader9 reading
  21. reader2 finish read
  22. reader1 finish read
  23. reader4 finish read
  24. reader3 finish read
  25. reader7 finish read
  26. reader8 finish read
  27. reader6 finish read
  28. reader5 finish read
  29. reader9 finish read
  30. writer1 writing
  31. writer1 finish write
  32. Process finished with exit code 0

总结

当一个写着后面读者比较多的时候,读的操作比较频繁的时候,写者可能处于较长的
时间等待,使得写者处于‘饿死’现象中

发表评论

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

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

相关阅读

    相关 读者--问题

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

    相关 读者_模型

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