在不同进程访问相同资源时,可以使用进程间通信(IPC)机制来实现线程安全。以下是一个使用互斥锁(mutex)实现线程安全的示例代码:
import multiprocessing
import time
# 共享资源
shared_resource = []
# 创建一个互斥锁
mutex = multiprocessing.Lock()
# 定义一个函数来修改共享资源
def modify_resource(process_id):
global shared_resource
# 锁住互斥锁
mutex.acquire()
try:
print(f'Process {process_id} is modifying the shared resource.')
# 模拟修改共享资源的操作
shared_resource.append(process_id)
time.sleep(1)
print(f'Process {process_id} has modified the shared resource.')
finally:
# 释放互斥锁
mutex.release()
# 创建多个进程来修改共享资源
if __name__ == '__main__':
processes = []
for i in range(5):
p = multiprocessing.Process(target=modify_resource, args=(i,))
processes.append(p)
p.start()
for p in processes:
p.join()
print(f'The final shared resource: {shared_resource}')
在上述代码中,我们首先导入了multiprocessing
模块,并创建了一个共享资源shared_resource
,它是一个列表。然后,我们使用multiprocessing.Lock()
创建了一个互斥锁mutex
。接下来,我们定义了一个modify_resource
函数,该函数用于修改共享资源。在函数内部,我们首先使用mutex.acquire()
来锁住互斥锁,然后进行修改共享资源的操作,最后使用mutex.release()
释放互斥锁。最后,我们创建了多个进程来调用modify_resource
函数,每个进程都传入一个不同的进程ID。最后,我们打印出最终的共享资源shared_resource
。
使用互斥锁可以确保在任意时刻只有一个进程可以修改共享资源,从而实现了线程安全。