跳到主要内容

三个线程按顺序打印递增数字

几年前遇到的面试题, 当时用的暴力解法, 但对如何优雅解决一直没有思路, 最近想起来咨询chatgpt终于有了解法.

要求: 三个线程按顺序打印递增数字.


import threading

# 定义一个全局变量,用于存储当前数字
current_number = 0

# 定义三个锁,用于同步线程
lock1 = threading.Lock()
lock2 = threading.Lock()
lock3 = threading.Lock()

# 定义三个线程函数,用于打印数字
def print_number1():
global current_number
while current_number < 10:
# 获取锁1
lock1.acquire()
# 打印当前数字
print(current_number)
# 增加数字
current_number += 1
# 释放锁1
lock1.release()
# 获取锁2
lock2.acquire()
# 释放锁2
lock2.release()

def print_number2():
global current_number
while current_number < 10:
# 获取锁2
lock2.acquire()
# 打印当前数字
print(current_number)
# 增加数字
current_number += 1
# 释放锁2
lock2.release()
# 获取锁3
lock3.acquire()
# 释放锁3
lock3.release()

def print_number3():
global current_number
while current_number < 10:
# 获取锁3
lock3.acquire()
# 打印当前数字
print(current_number)
# 增加数字
current_number += 1
# 释放锁3
lock3.release()
# 获取锁1
lock1.acquire()
# 释放锁1
lock1.release()

# 创建三个线程
t1 = threading.Thread(target=print_number1)
t2 = threading.Thread(target=print_number2)
t3 = threading.Thread(target=print_number3)

# 启动线程
t1.start()
t2.start()
t3.start()

# 等待线程结束
t1.join()
t2.join()
t3.join()

线程无序的版本, 向chatgpt指出问题后, 竟然修复解决了.


import threading

# 定义一个全局变量,用于存储当前数字
current_number = 0

# 定义一个锁,用于同步线程
lock = threading.Lock()

# 定义一个线程函数,用于打印数字
def print_number():
global current_number
while current_number < 10:
# 获取锁
lock.acquire()
# 打印当前数字
print(current_number)
# 增加数字
current_number += 1
# 释放锁
lock.release()

# 创建三个线程
threads = []
for i in range(3):
t = threading.Thread(target=print_number)
threads.append(t)

# 启动线程
for t in threads:
t.start()

# 等待线程结束
for t in threads:
t.join()

咨询 chatgpt

picture 0

picture 1

java的版本

picture 2

created at Wed Jul 05 2023 08:00:00 GMT+0800 (China Standard Time)