基于切换实现互斥的线程创建及Python代码修正与执行时间计算求助
代码修复与优化
问题分析
- 死锁问题:
turn初始值为0,但创建线程时传入的标识是1和2,导致两个线程在entra_cs中无限等待turn等于自己的标识,永远无法进入临界区,直接死锁。 - 时间计算错误:输出执行时长时用了
comeco - fim,这会得到负数,正确逻辑应该是结束时间减去开始时间。
修改后的代码
import threading import time x = 0 turn = 0 def entra_cs(task_id): global turn while turn != task_id: pass def sai_cs(total_tasks): global turn turn = (turn + 1) % total_tasks def incrementa(): global x x = x + 1 def thread_task(task_id): # 传入总线程数2,确保sai_cs能正确切换turn for _ in range(10): entra_cs(task_id) incrementa() sai_cs(2) def main_task(): global x x = 0 # 线程标识改为0和1,匹配turn的初始值范围 t1 = threading.Thread(target=thread_task, args=(0,)) t2 = threading.Thread(target=thread_task, args=(1,)) t1.start() t2.start() t1.join() t2.join() if __name__ == "__main__": comeco = time.time() for i in range(10): main_task() print("Iteration {0}: x = {1}".format(i, x)) fim = time.time() # 修正时间计算顺序 print('Duration in seconds -', fim - comeco)
关键修改说明
- 线程标识从1、2改为0、1,和
turn的初始值0以及取模逻辑匹配,确保线程能正确进入临界区。 sai_cs调用时传入总线程数2,保证turn在0和1之间循环切换。- 修正时长计算为
fim - comeco,得到正确的正数执行时间。
内容的提问来源于stack exchange,提问作者fm_0091
相关产品推荐
相关产品推荐

