如何在Python中使用多线程查找二维数组的最小值
问题原因
- 没有做最小值对比逻辑:你的代码中每个线程直接把当前行的最小值覆盖全局存储的
minThreads['minThreads'],没有和已有的全局最小值做比较,最终结果由最后执行完成的线程决定,你当前测试用例中处理第三行[5,6]的线程最后运行结束,所以输出为5。 - 没有等待所有线程执行完成:主线程启动所有子线程后没有调用
join()等待子线程全部执行完毕,直接读取全局变量结果,即使逻辑正确也可能出现提前读值的错误。 - 冗余参数未使用:函数定义的
**total参数没有实际用到,直接操作全局变量,虽然字典是可变对象不影响运行,但属于无效代码。
正确实现方法
我们可以通过线程锁保证全局最小值更新的原子性,同时增加最小值对比逻辑,并且等待所有线程执行完成后再读取结果,示例代码如下:
import threading matrix = [[1, 2],[3, 4],[5, 6]] # 初始化全局最小值为无穷大 global_min = {"value": float('inf')} lock = threading.Lock() def calc_row_min(row_idx): # 计算当前行的最小值 current_min = min(matrix[row_idx]) # 加锁保证更新全局变量的原子性 with lock: if current_min < global_min["value"]: global_min["value"] = current_min threads = [] for i in range(len(matrix)): t = threading.Thread(target=calc_row_min, args=(i,)) threads.append(t) t.start() # 等待所有线程执行完成 for t in threads: t.join() print(global_min["value"])
运行上述代码会正确输出最小值1。
内容的提问来源于stack exchange,提问作者neekitit
相关产品推荐
相关产品推荐

