线程锁、线程队列、yield

Unity多线程开发实战:线程锁原理、应用场景与避坑指南 多线程编程是现代软件开发中提升性能的关键技术,它允许多个任务并发执行,从而更高效地利用多核CPU资源。其核心原理在于操作系统对线程的调度与管理,但并发访问共享资源会引发竞态条件,导致数据不一致等线程安全问题。为解决此问题,线程同步技术应运而生,其中线程锁是最基础的同步原语,它通过互斥机制确保临界区代码的原子性执行。在游戏开发与Unity引擎中,多线程技术对于处理后台资源加载、网络通信与复杂计算至关重要,能有效避免主线程阻塞,保障游戏流畅性。然而,Unity引擎API本身并非线程安全,这要求开发者在子线程中协 阅读详情

1.  线程锁:当有一个数据有多个线程对其进行修改的时候,任意个线程改变它都会对其他线程造成影响。如果想在某一个线程使用完之前,其他线程不能对其进行修改,就需要对这个线程加一个线程锁。

import threading
import time
import random

count = 0
def get_money(money):
    global count
    count += money
    count += money
    count -= money
# 创建一个线程锁对象
lock = threading.Lock()
def lock_thread(money):
    # acquire捕获
    lock.acquire()
    time.sleep(random.randint(1,3))
    print('当前线程为',threading.current_thread().name)

    get_money(money)
    time.sleep(random.randint(1, 3))
    print('当前线程为', threading.current_thread().name)
    # 解锁
    lock.release()

# 创建线程的参数为一个元组类型 args必须为一个可叠加对象
# 主线程 开辟一个分线程
thread1 = threading.Thread(target=lock_thread,name='thread1',args=(1000,))
thread2 = threading.Thread(target=lock_thread,name='thread2',args=(2000,))
thread1.start()
thread2.start()
print('hello world')

线程锁和join的区别:

join :注重的是整体,线程1没执行完,线程2不能执行;

线程锁 : 注重的是局部,某一个变量没执行完,其他的不能执行。

 

2.  线程队列:

# queue 队列
import queue
# 创建一个线程队列
# 队列:FIFO frist in frist OUT 先进先出
q = queue.Queue()
for i in range(5):
    # 将内容放入到线程队列中
    q.put(i)
while not q.empty():
    # get 得到
    print(q.get())
# Lifo last in frist out 后进先出
p = queue.LifoQueue()
for i in range(5):
    p.put(i)
while not p.empty():
    print(p.get())

例子 : 利用上述内容,写一个卖票系统:

import threading
import time
import random

class buyer(object):
    def __init__(self,name = '',number = 1 ):
        self.number = number
        self.name = name
lock = threading.Lock()
class computer(object):
    def __init__(self,count = 0):
        self.count = count
    def query_with_buyer_info(self,other):

        print('正在为{}查询剩余票数'.format(other.name))
        time.sleep(random.randint(1,3))
        lock.acquire()
        if self.count > other.number:
            print('有票,{}可以买'.format(other.name))
            time.sleep(random.randint(1,3))
            self.count -=other.number
        else:
            print('没票')
        lock.release()
hanmeimei = buyer('韩梅梅',2)
houzi = buyer('猴子',5)

com = computer(6)
thread1 = threading.Thread(target=com.query_with_buyer_info,name='thread1',args=(hanmeimei,))
thread2 = threading.Thread(target=com.query_with_buyer_info,name='thread2',args=(houzi,))

thread1.start()
thread2.start()

3.yield

def test1(name):
    print('return方法')
    return name
    print('return方法结束')
name = test1('zhangsan')
print(name)

def test2(age):
    for i in range(age):
        yield i
        print('hello')
for x in test2(18):
    print('x=',x)

return 与yield 的区别:

return 可以往方法外传递一个值,return之后的代码统统不执行

yield 也可以往方法外传递值,但是传递之后,代码回到yield的后面继续执行。同时,通过yield传递值,是一个可迭代的对象。

2023年全国赛C题《 电容电感测量装置》设计报告 参考下面网站的方案参考LCR测试仪,基本工作原理为给DUT加上正弦激励信号,然后测得该DUT两端的电压和流过DUT的电流,即可通过计算得到DUT的性质和参数。对于一个理想电容,电流相位应该超前电容两端电压90°。然而实际的电容存在损耗,可以等效为一个理想电容Cp​和一个理想电阻Rp​的并联,因此电流超前电压的相位将小于90°,这个角度差即为损耗角。假设DUT两端电压V˙Vcosωt,流过DUT的电流为I˙Isinωt−φ。 阅读详情

相关推荐

YOLOv11n-seg 实战指南:从训练到模型部署的完整流程

本文提供了YOLOv11n-seg实例分割模型从环境准备、数据标注到模型训练、验证及最终部署的完整实战指南。详细讲解了如何准备多边形掩码数据、配置关键训练参数、解读分割核心评估指标,并重点介绍了将模型导出为ONNX等格式进行部署的流程与优化技巧,帮助开发者高效完成从开发到生产的全链路实践。

weixin_29062255的博客 554

多线程基础(线程创建、线程状态、线程同步、通信、线程池)

java之多线程线程的创建与实现创建线程的三种方式1. 继承Thread类2. 实现Runnable接口3. 实现Callable接口线程状态线程的六大状态线程停止线程休眠_sleep线程礼让_yield线程强制执行_join线程同步的方式synchonized与lock的区别线程通信问题生产者消费者问题信号灯法线程池 线程的创建与实现 创建线程的三种方式 1. 继承Thread类 实现:继承Thread类,重写run()方法,调用start开启线程 public class ThreadStudy ext

weixin_45416687的博客 704

Cadence IC618/Spectre231安装避坑指南:详解License配置、环境变量隔离与依赖检查

本文详细介绍了Cadence IC618/Spectre231的安装与配置避坑指南,包括许可证系统精妙控制、环境隔离模块化实践、依赖管理进阶技巧以及长期维护的黄金法则。通过实战案例和解决方案,帮助工程师构建稳定可靠的EDA工作环境,提升芯片设计效率。

weixin_28683065的博客 461

C#中的yield return详细解释

yield return 的使用介绍。

yuanpan的专栏 1971

合成孔径雷达(SAR)的常见工作模式

随着星载SAR技术研究的深入发展,单一的条带模式已经无法满足当今时代的需求,因此许多新的工作模式相继被提出。这些新模式在分辨率和测绘宽度等方面都有所提高,接下来将简要介绍几种常用的工作模式。

m0_51390495的博客 2315

Python爬虫实战:5分钟搞定东方财富网股票数据抓取(附完整代码)

本文详细介绍了如何利用Python爬虫技术,快速抓取东方财富网的实时股票数据。通过逆向分析其JSONP数据接口,构建了包含请求处理、数据清洗、分页调度及多格式存储的完整自动化采集系统,并提供了应对反爬策略与生产部署的进阶优化思路,附有可直接运行的完整代码。

weixin_29084231的博客 875

Thread.yield( )方法详解

Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。 yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保 证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行! ...

felix 7119

YOLO26 终极蒸馏指南:从入门到 SOTA (The Ultimate Distillation Guide)

《YOLO26 蒸馏技术指南》深入解析了知识蒸馏在目标检测中的应用,提出五大蒸馏范式:响应蒸馏(学习最终输出)、特征蒸馏(模仿中间特征)、关系蒸馏(捕捉通道关联)、CWD(通道语义对齐)和FGD(前景背景分离)。实验表明,"Response KD + CWD + FGD"组合效果最佳,使YOLO26n在0.5ms推理速度下达到0.956 mAP50,甚至超越教师模型。指南提供模块化代码实现和超参数调优建议,强调蒸馏能平衡模型精度与效率,是轻量化部署的有效方案。

weixin_51988935的博客 717

Thread类中的yield()方法有什么作用?

1.Yield()方法作用就是礼让,可以暂停当前正在执行的线程对象,让其它有相同优先级的线程执行。 ...

m0_51697147的博客 650

第10章: MMU notifier与HMM的协作

本文摘要: HMM(Heterogeneous Memory Management)是Linux内核提供的异构内存管理框架,用于统一CPU与设备(如GPU、DSP等)的内存访问。它通过镜像页表技术实现虚拟地址空间共享,自动同步CPU和设备页表变化,支持透明的内存迁移和设备内存管理。HMM构建在mmu_interval_notifier机制上,利用序列号检测页表修改冲突,提供高效并发控制。核心数据结构包括hmm_range和HMM PFN标志位,通过hmm_range_fault()实现页表遍历和缺页处理。

图形/计算GPU的驱动与虚拟化技术分享园地 3098

sleep()和yield()有什么区别?

sleep() 方法给其他线程运行机会时不考虑线程的优先级;yield() 方法只会给相同优先级或更高优先级的线程运行的机会 线程执行 sleep() 方法后进入阻塞状态;线程执行 yield() 方法转入就绪状态,可能马上又得得到执行 sleep() 方法声明抛出 InterruptedException;yield() 方法没有声明抛出异常 sleep() 方法需要指定时间参数;yiel...

ConstXiong 1110

YOLOv11 改进 - 特征融合 | RepGFPN重参数化特征金字塔网络 ,实现高效多尺度特征交互与融合

本文介绍了DAMO - YOLO目标检测方法及其相关技术在YOLOv11中的结合。DAMO - YOLO扩展了多项新技术,如MAE - NAS搜索检测主干网络、Efficient - RepGFPN构建检测neck等。在neck设计上,针对原始GFPN存在的问题,提出Efficient - RepGFPN,包括对不同尺度特征使用不同通道数、删除Queen - Fusion中额外上采样操作、改进特征融合方式等。我们将相关模块集成进YOLOv11,替换部分模块。

魔改工程师的博客 936

Python——进程与线程以及yield与return的区别

一、进程与线程        1. 一个程序至少有一个进程,一个进程至少有一个线程        2. 线程的划分尺度小于进程,使得多线程程序的并发性高        3. 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率       4. 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应...

ljj950408的博客 1118

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Python线程详解

在正式介绍线程之前我们,首先要了解一下进程与线程的关系,以及分线程等等种种概念 进程:每个程序都会有一个进程负责管理程序各个功能的执行,进程只会有一个。 线程:每个进程里面至少有一个线程,称为主线程,除此之外,还会有其他的线程,称之为分线程。 如果读者对于线程基本概念不太了解,可以参看一下知名博主阮一峰的一篇博客:《进程与线程的一个简单解释》。 1.线程的基本操作。 Python中多线程...

本以为成功很简单,没想到活成普通人都需拼尽全力! 519

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

python细节

在同一个线程里面,可以连续调用多次acquire,一定要注意acquire的次数和release的次数相同 python解释器包含了python虚拟机 https://www.zhihu.com/question/59570108?sort=created for是按顺序执行,当其中卡主,会根据上下文进行切换到别的地方执行 在woindows下进行多进程编程,最好放在 if ...

qq_35810838的博客 1689

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python高级编程 ---- 多任务编程_多进程编程 & 多线程编程 & 协程

文章目录多任务编程一、多任务管理1.多任务定义2.单核CPU如何实现“多任务”?3.多核CPU如何实现“多任务”?二、多进程编程1.程序和进程:2.进程的五状态模型:3.fork()实现创建子进程创建子进程:4.多进程编程(1)多进程修改全局变量(2)实例化对象方式实现多进程编程①多进程编程join()方法理解②进程池管理(3)创建子类的方式实现多进程编程三、多线程编程四、协程 多任务编程 一、多...

weixin_44568633的博客 1498

Python开发【第九章】:线程、进程和协程

一、线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 注:cpu内一个核数只能同时运行一个线程,所以多核cpu同时可以运行多个线程;但是在Python中,即使是多核cpu,同时运行的线程也只有一个,Python语言设计之初就不支持多核,所以在Py...

abchhcba2014的博客 204

多线程wait、yield、sleep、join详解

wait、yield、sleep详解

echo.T的博客 1854

线程sleep与wait的区别(拓展yield和join)

线程sleep与wait的区别(拓展yield和join) 关于这道题(多选题)关于 sleep()和 wait(),以下描述正确的一项是( ) ​ A.sleep 是线程类(Thread)的方法,wait 是 Object 类的方法; ​ B.sleep 不释放对象锁,wait 放弃对象锁; ​ C.sleep 暂停线程、但监控状态仍然保持,结束后会自动恢复; ​ D.wait 后进入等待锁定...

a15119273009的博客 899

sleep、yield、interrupt等方法的区别

sleep方法是让线程进入阻塞队列,cpu不会分配时间片给。sleep()是Thread中的静态本地方法。中的线程,可以使用该特性,防止cpu空转。调用sleep方法后,线程处于。

weixin_45935149的博客 304

Java多线程之线程状态和关键字讲解

文章目录1 原子操作1.1 引言1.2 术语定义1.3 处理器如何实现原子操作1.3.1 处理器自动保证基本内存操作的原子性1.3.2 使用总线锁保证原子性1.3.3 使用缓存锁保证原子性1.4 JAVA如何实现原子操作1.4.1 使用循环CAS实现原子操作1.4.2 使用锁机制实现原子操作 1 原子操作 1.1 引言 原子(atom)本意是不能被进一步分割的最小粒子,而原子操作(atomic operation)意为不可被中断的一个或一系列操作 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊

上善若泪 1413

使用线程锁(lock)实现线程同步_Java线程生命周期和锁的简单使用

分享个个人技术公众号,回复Java 领取一整套进阶技术资料本文介绍了java线程的生命周期,Synchronized的几个方法简单的使用。线程生命周期初始状态(New)New Thread之后, 就绪状态(Ready)表示获取到了Cpu的执行时间片,也就是cpu的执行权,等待开始执行。 运行状态(Runable)执行start之后,开始运行。 阻塞状态(Blocked)在进入synchronize...

weixin_39964590的博客 131

线程面试题话术

我理解的锁的话,就是在多个线程同时访问一个数据的时候,为了保证数据的安全性,我们需要对数据操作的代码进行加锁处理,一般来说这个锁需要是对所有线程是一致的,一般可以用静态变量来作为锁,这个锁用synchronized关键字来包裹着,当这段代码块执行完之后,释放锁,然后其他线程获取到这个锁之后,才能执行这段代码,通过锁的机制很好的保护了多线程下的数据安全。

qq_41986872的博客 548

线程的几种状态

新建( new ):新创建了一个线程对象. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 . 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执行程序代码。 阻塞( bloc...

听得到微笑的博客 500

Java线程

Java线程初识线程类结构Runnable接口Future接口RunnableFuture接口FutureTask 初识线程 待补充 类结构 Runnable接口 任务 Future接口 表示异步的结果计算。 检查计算是否为完成,等待其完成并检索出结果。 取消,一旦计算已完成,无法取消计算。 RunnableFuture接口 成功执行 run()方法会导致完成并允许访问其结果 Fut...

wanghui115521的专栏 149
上一篇: 线程
下一篇: 爬虫--获取文本并拼接的几种方法
想不到叫啥好
博客等级 码龄8年 7粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值