结合信号量和互斥锁(Mutex)实例
时间: 2024-10-03 16:01:49 浏览: 30
这里有一个简单的Python示例,展示了如何结合信号量(Semaphore)和互斥锁(Lock)来管理并发资源:
```python
import threading
from threading import Semaphore, Lock
# 创建一个信号量,表示最大同时在线用户数
max_users_semaphore = Semaphore(5)
# 创建一个互斥锁,用于保护数据库操作
db_lock = Lock()
def user_task(user_id):
with max_users_semaphore: # 获取信号量,限制用户数量
db_lock.acquire() # 获取互斥锁,进入数据库临界区
print(f"User {user_id} is connecting.")
# 执行数据库操作...
db_lock.release() # 完成操作后释放互斥锁
print(f"User {user_id} disconnected.")
# 启动多个用户任务
for i in range(10):
threading.Thread(target=user_task, args=(i,)).start()
```
在这个例子中,信号量`max_users_semaphore`确保最多只有5个用户同时在线。每个用户连接时会先尝试获取信号量,如果信号量已满,则线程会被阻塞。一旦得到信号量,用户就可以尝试获取`db_lock`,这代表他们有权限执行数据库操作。完成操作后,释放互斥锁,允许下一个用户进行数据库交互。
阅读全文