lock_rlock.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import _thread
  2. import time
  3. import threading
  4. import PikaStdLib
  5. # 共享资源
  6. shared_resource = 0
  7. # 互斥锁
  8. mutex = threading.Lock()
  9. # 线程函数
  10. finished = 0
  11. def thread_function(name, delay):
  12. global shared_resource
  13. global mutex, finished
  14. print("delay : %s" % str(delay))
  15. k = 0
  16. i = 0
  17. mem = PikaStdLib.MemChecker()
  18. for i in range(5):
  19. # while 1:
  20. try:
  21. # 获取互斥锁
  22. print("%s try to acquire lock. #1" % name)
  23. res = mutex.acquire(True, None)
  24. print("res: %s" % str(res))
  25. if 1: # 测试RLock或者Lock的超时加上
  26. print("%s try to acquire lock. #2" % name)
  27. res = mutex.acquire(True, 0.5)
  28. print("res: %s" % str(res))
  29. if res:
  30. print("%s acquire lock SUCC." % name)
  31. else:
  32. print("%s acquire lock FAIL." % name)
  33. # 打印当前线程名称和共享资源的值
  34. print("Thread %s: Iteration %d, Shared Resource: %d" %
  35. (name, i, shared_resource))
  36. # 更新共享资源
  37. shared_resource += 1
  38. # 模拟工作时间
  39. time.sleep(delay)
  40. print("wake")
  41. # 释放互斥锁
  42. mutex.release()
  43. mutex.release()
  44. k += 1
  45. print("%s i = %d." % (name, i))
  46. # print('mem used now:')
  47. # mem.now()
  48. except:
  49. print("------------- error ---------------")
  50. print("%s exit , at last, i = %d." % (name, k))
  51. finished += 1
  52. # 主函数
  53. def main():
  54. # 创建第一个线程
  55. _thread.start_new_thread(thread_function, ("Thread-1", 0.1))
  56. time.sleep(0.5)
  57. # 创建第二个线程
  58. _thread.start_new_thread(thread_function, ("Thread-2", 0.2))
  59. # 主线程等待子线程结束
  60. # 由于 _thread 没有 join 方法,我们通过 sleep 来模拟等待
  61. # time.sleep(60)
  62. while finished < 2:
  63. time.sleep(1)
  64. time.sleep(1)
  65. main()