【Python】条件变量、信号变量、事件

本文介绍了Python中的线程同步工具,包括条件变量、信号量和事件。条件变量允许线程等待特定条件为真,与互斥锁配合使用避免竞争。信号量用于资源互斥访问,简化线程同步。事件则通过特定动作触发操作。文中给出了具体的案例,如车站安检限制人数、生产者消费者问题和事件触发的应用。
摘要由CSDN通过智能技术生成

条件变量、信号变量、事件

  • 信号量:信号量是用来解决线程同步和互斥的通用工具, 和互斥量类似, 信号量也可以用作于资源互斥访问, 但信号量没有所有者的概念,在应用上比互斥量更广泛,信号量比较简单, 不能解决优先级反转问题,但信号量是一种轻量级的对象,比互斥量小巧,灵活,因此在很多对互斥要求不严格的的系统中,经常使用信号量来管理互斥资源。
    通常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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值