You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于切换实现互斥的线程创建及Python代码修正与执行时间计算求助

代码修复与优化

问题分析

  1. 死锁问题:turn初始值为0,但创建线程时传入的标识是1和2,导致两个线程在entra_cs中无限等待turn等于自己的标识,永远无法进入临界区,直接死锁。
  2. 时间计算错误:输出执行时长时用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:05:05