import threading num = 0 lock = threading.Lock() def handler_incry(): global num lock.acquire() for i in range(10): num += 1 print("handler_incry done, num =", num) lock.release() def handler_decry(): global num lock.acquire() for i in range(10): num -= 1 print("handler_decry done, num =", num) lock.release() if __name__ == '__main__': t1 = threading.Thread(target=handler_incry) t2 = threading.Thread(target=handler_decry) t1.start() t2.start() t1.join() t2.join()
时间: 2024-01-23 11:03:45 浏览: 122
这段代码是一个使用锁(Lock)实现线程同步和互斥的例子。其中,有两个线程分别对一个全局变量 num 进行加减操作,使用锁来保证同一时刻只有一个线程能够访问共享资源(即 num 变量)。
具体实现如下:
1. 定义全局变量 num 和锁 lock。
```python
import threading
num = 0
lock = threading.Lock()
```
2. 定义两个线程分别对 num 进行加和减操作。
```python
def handler_incry():
global num
lock.acquire() # 获取锁
for i in range(10):
num += 1
print("handler_incry done, num =", num)
lock.release() # 释放锁
def handler_decry():
global num
lock.acquire() # 获取锁
for i in range(10):
num -= 1
print("handler_decry done, num =", num)
lock.release() # 释放锁
```
3. 在主线程中创建两个子线程,并启动它们。
```python
if __name__ == '__main__':
t1 = threading.Thread(target=handler_incry)
t2 = threading.Thread(target=handler_decry)
t1.start() # 启动线程1
t2.start() # 启动线程2
t1.join() # 等待线程1执行完毕
t2.join() # 等待线程2执行完毕
```
当线程1获取锁并对 num 进行加操作时,线程2会被阻塞,直到线程1释放锁后才能获取锁并对 num 进行减操作。这样就保证了同一时刻只有一个线程能够访问共享资源,从而避免了数据竞争和死锁等问题。
总的来说,这段代码是一个简单的例子,展示了如何使用锁(Lock)实现线程同步和互斥。在实际应用中,需要根据具体场景选择合适的线程同步和互斥机制,以确保多线程程序的正确性和稳定性。
阅读全文