条件变量、信号变量、事件
- 信号量:信号量是用来解决线程同步和互斥的通用工具, 和互斥量类似, 信号量也可以用作于资源互斥访问, 但信号量没有所有者的概念,在应用上比互斥量更广泛,信号量比较简单, 不能解决优先级反转问题,但信号量是一种轻量级的对象,比互斥量小巧,灵活,因此在很多对互斥要求不严格的的系统中,经常使用信号量来管理互斥资源。
通常sem_post()和sem_wait()函数对信号量进行加减操作从而解决线程的同步和互斥。
相关定义:
数据类型:sem_t
信号量的创建:sem_init()
信号量的销毁:sem_destroy(sem_t* sem, int pshared, unsigned value);
( 第一个参数是信号量指针,第二个参数表示是否在进程间共享的标志,第三个参数表示信号量的初值;)
信号量的加操作:sem_post();(调用一次加1)
信号量的减操作:sem_wait();阻塞版本(调用一次减1)
信号量的减操作:sem_trywait();非阻塞版本
当线程调用sem_wait()后,若信号量的值小于0则线程阻塞。只有其他线程在调用sem_post对信号量作加操作后并且其值大于等于0时,阻塞的线程才能继续运行。
案例:
车站有3个安检口,那么同时只能有3个人安检,别人来了,只能等着别人安检完才可以过。
import threading
import os, time
# 一次只允许3个人同时过安检
semapshore = threading.BoundedSemaphore(3)
def run(num):
semapshore.acquire() # 获得信号量的锁
print(f'第{
num}个人正在过安检')
time.sleep(2)
semapshore.release() # 释放这把锁
if __name__ == '__main__':
# 创建子线程
thread