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

  • 信号量:信号量是用来解决线程同步和互斥的通用工具, 和互斥量类似, 信号量也可以用作于资源互斥访问, 但信号量没有所有者的概念,在应用上比互斥量更广泛,信号量比较简单, 不能解决优先级反转问题,但信号量是一种轻量级的对象,比互斥量小巧,灵活,因此在很多对互斥要求不严格的的系统中,经常使用信号量来管理互斥资源。
    通常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 = []for i in range(100):t = threading.Thread(target=run, args=(i,))t.start()thread.append(t)for t in thread:t.join()print('主线程执行完毕')
  • 条件变量:条件变量(condition variable)是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待某个条件为真,而将自己挂起;另一个线程使的条件成立,并通知等待的线程继续。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。
相关定义:

数据类型:pthread_cond_t;

初始化:pthread_cond_init();

销毁:pthread_cond_destroy();

条件变量等待操作:pthread_cond_wait();

带有超时的等待:pthread_cond_timewait();

条件变量的解除等待操作:pthread_cond_signal();——通知单个线程

条件变量的解除等待操作:pthread_cond_broadcast();——通知所有线程

案例:

假设有一群生产者(Producer)和一群消费者(Consumer)通过一个市场来交互产品。生产者的”策略“是如果市场上剩余的产品少于1000个,那么就生产100个产品放到市场上;而消费者的”策略“是如果市场上剩余产品的数量多余100个,那么就消费3个产品。用Condition解决生产者与消费者问题的代码如下:

import threading
import timeclass Producer(threading.Thread):
def run(self):
global count
while True:
if con.acquire():
if count > 1000:con.wait()
else:count = count+100msg = self.name+' produce 100, count=' + str(count)
print msgcon.notify()con.release()time.sleep(1)class Consumer(threading.Thread):
def run(self):
global count
while True:
if con.acquire():
if count < 100:con.wait()
else:count = count-3msg = self.name+' consume 3, count='+str(count)
print msgcon.notify()con.release()time.sleep(1)count = 500
con = threading.Condition()def test():
for i in range(2):p = Producer()p.start()
for i in range(5):c = Consumer()c.start()
if __name__ == '__main__':test()
  • 事件:事件是通过某一时刻某一个动作而触发的一个操作。事件的形成有两步:第一步是事件的预先定义;第二步事件触发。
事件触发案例:
#coding:utf-8
import  threadingevent  =  threading.Event()def  a():print ( "我是第一个线程函数a,我在等待函数b来触发我..." )event.wait()print ( "函数a说:尼玛!我被函数b给触发了..." )def  b():print ( "我是第二个线程函数b,我开始去触发函数a..." )event. set ()p  =  threading.Thread(target = a)
c  =  threading.Thread(target = b)p.start()
c.start()

【Python】条件变量、信号变量、事件相关推荐

  1. 【前端06_JS_ECMA 语法标准】声明变量、数据类型*、tupeof返回值、输入输出、运算、循环、条件、函数*、事件*

    JavaScript_ECMA 概述 ECMA 语法标准 声明变量 全局变量 注释方法 数据类型 * typeOf 能返回的值 * 输入与输出 运算 算数运算 赋值运算 关系运算 关系运算中的特殊题目 ...

  2. python的数据类型和变量

    python的数据类型和变量 数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种 ...

  3. python变量定义问题_python 定义n个变量方法 (变量声明自动化)

    python 定义n个变量方法 (变量声明自动化) code: for i in range(100): cmd = "t%s = 1" % i exec cmd eval(&qu ...

  4. python变量词是什么意思_Python语言基本语法元素之变量,变量的含义及命名规则...

    教学是对知识的二次加工. 笔者希望给python初学者提供帮助.上一篇文章写了Python语言基本语法元素之格式框架:注释.缩进.续行符 这里继续,Python语言基本语法元素之变量. 我们来看看前4 ...

  5. python语言保留字可以用变量名来命名_Python语言基本语法元素之变量,变量的含义及命名规则...

    教学是对知识的二次加工. 笔者希望给python初学者提供帮助.上一篇文章写了Python语言基本语法元素之格式框架:注释.缩进.续行符 这里继续,Python语言基本语法元素之变量. 我们来看看前4 ...

  6. python定义一个整数变量a_第二篇.1、python基础之数据类型与变量

    一.变量 1 什么是变量之声明变量 #变量名=变量值 age=18 gender1='male' gender2='female' 2 为什么要有变量 变量作用:"变"=>变 ...

  7. Python基本语法_变量作用域LEGB

    目录 目录 软件系统 变量的作用域 高级语言对数据类型的使用过程 作用域的产生 作用域的类型 Llocal局部作用域 Eenclosing嵌套作用域 Gglobal全局作用域 Bbuilt-in内置作 ...

  8. python中的class怎么用_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  9. python老是报参数未定义_浅谈Python程序的错误:变量未定义

    Python程序的错误种类 Python程序的错误分两种.一种是语法错误(syntax error).这种错误是语句的书写不符合Python语言的语法规定.第二种是逻辑错误(logic error). ...

最新文章

  1. 《OpenCV3编程入门》学习笔记6 图像处理(六)图像金字塔与图片尺寸缩放
  2. 《C++面向对象高效编程(第2版)》——2.29 泛化关系(is-a)
  3. Android之实现京东底部添加到购物车的效果
  4. 深入浅出SharePoint2013——获取Application Pool的id和name对照表
  5. 雅客EXCEL (3)-合并取消单元格、平均值、添加序号
  6. HTTP的四种请求方法
  7. EXCEL VBA 导入图片自适应大小
  8. 休息使用Jersey –包含JAXB,异常处理和客户端程序的完整教程
  9. redis缓存原理与实现_基于Redis实现范围查询的IP库缓存设计方案
  10. axios vue 动态date_Web前端Vue系列之-Vue.js 实战
  11. matlab自带SVM算法例子(附函数详解)
  12. 机房收费系统--需求文档
  13. coffeescript java 执行_新的coffeescript,运行cakefile时产生ENOENT错误
  14. 科技巨头们在SaaS市场“雷声大雨点小”背后的症结
  15. 机器学习6:——Pandas——6:高级处理3:数据合并
  16. 文化馆建筑方案设计原理及方案
  17. 生物基础知识---CDS,基因,Matlab生物信息工具箱
  18. 【01】花卉识别-基于tensorflow2.3实现
  19. 【工具】Gamepad Tester游戏手柄在线测试平台
  20. C++自制打印正方形小游戏

热门文章

  1. Linux 目录文件与管理
  2. Retrofit 2.0 超能实践(一),okHttp完美支持Https传输
  3. Python3爬取淘宝网商品数据!
  4. 中国LED芯片行业市场竞争状况分析及十si五发展趋势研究报告2021~2027年
  5. tomcat-添加操作日志
  6. intellij idea 合并分支到主分支,主分支代码同步到某一分支
  7. UE4 创建暂停和结束游戏UI
  8. MyBatis的核心对象
  9. idea 启动页图片更新2022.1以及2021
  10. 中控门禁无法添加设备,提示表结构不存在或接收超时