Python中使用Semaphore()实现线程同步的例子
发布时间:2023-12-24 13:22:42
在Python中,可以使用Semaphore()来实现线程同步,它是一个计数器,用来控制同时访问某个资源的线程数量。
下面是一个使用Semaphore()实现线程同步的例子:
import threading
# 创建一个信号量,初始值为1
semaphore = threading.Semaphore(1)
# 共享资源
shared_resource = 0
# 线程函数
def increment():
global shared_resource
# 等待信号量
semaphore.acquire()
# 修改共享资源
shared_resource += 1
# 释放信号量
semaphore.release()
# 创建10个线程并启动
threads = []
for _ in range(10):
thread = threading.Thread(target=increment)
threads.append(thread)
thread.start()
# 等待所有线程结束
for thread in threads:
thread.join()
# 打印共享资源的值
print("共享资源的值:", shared_resource)
在上面的例子中,我们创建了一个信号量semaphore,初始值为1。共享资源shared_resource的初始值为0。
线程函数increment()中,首先调用semaphore.acquire()来申请信号量。如果信号量的值大于0,说明没有其他线程正在访问共享资源,线程可以继续执行。如果信号量的值为0,说明有其他线程正在访问共享资源,线程会被阻塞,直到有信号量被释放。
然后,线程在临界区内修改共享资源。这里简单地将共享资源加1。
最后,线程调用semaphore.release()来释放信号量,允许其他线程访问共享资源。
在主程序中,我们创建了10个线程并启动。然后,等待所有线程结束。最后,打印共享资源shared_resource的值,由于使用了信号量的线程同步控制,每个线程都能正确地增加shared_resource的值。
上述例子中,我们使用了初始值为1的信号量来控制对共享资源的访问。这意味着同一时间只允许一个线程访问临界区,其他线程将被阻塞。
如果我们改变信号量的初始值为2,即semaphore = threading.Semaphore(2),那么同一时间将允许两个线程访问临界区,其他线程仍将被阻塞。
在实际应用中,我们可以根据需求调整信号量的初始值,以控制对共享资源的并发访问。
