首页 > 其他分享 >线程的互斥锁

线程的互斥锁

时间:2024-05-29 12:32:44浏览次数:12  
标签:__ task money list 互斥 线程 main

【一】未加锁会产生的问题

  • 所有子线程都会进行阻塞操作,导致最后的改变只是改了一次
from threading import Thread
import time

money = 100


def task():
    global money
    # 模拟获取到车票信息
    temp = money
    # 模拟网络延迟
    time.sleep(2)
    # 模拟购票
    money = temp - 1


def main():
    task_list = [Thread(target=work) for i in range(100)]
    [task.start() for task in task_list]
    [task.join() for task in task_list]
    # 所有子线程结束后打印 money
    print(money)

if __name__ == '__main__':
    main()
    # 99

【二】加锁后

  • 在数据发生变化的地方进行加锁处理
from threading import Thread, Lock
import time

money = 100
# 生成锁
mutex = Lock()


def work():
    global money
    # 数据发生改变之前加锁
    mutex.acquire()
    # 模拟获取到车票信息
    temp = money
    # 模拟网络延迟
    time.sleep(0.6)
    # 模拟购票
    money = temp - 1
    # 数据发生改变后解锁
    mutex.release()


def main():
    task_list = [Thread(target=work) for i in range(100)]
    [task.start() for task in task_list]
    [task.join() for task in task_list]
    # 所有子线程结束后打印 money
    print(money)


if __name__ == '__main__':
    main()
    # 0

标签:__,task,money,list,互斥,线程,main
From: https://www.cnblogs.com/ligo6/p/18218361

相关文章

  • 多核通讯、线程通讯、进程通讯的区别
    多核通讯多核通讯通常指的是在多处理器系统中,不同核心之间的数据交换和协同工作。多核通讯的实现方式多种多样,包括但不限于高速缓存一致性协议、总线通信、交叉开关等。多核通讯的特点是高速率和低延迟,但实现起来较为复杂,需要硬件和操作系统层面的紧密合作。线程通讯线程通......
  • JAVAEE之线程多进阶(1)_常见的锁策略
    前言 在前面的线程初阶的内容中,我们已经简单介绍了锁,包括synchronized、volatile关键字(详细内容可见:https://blog.csdn.net/2301_80653026/article/details/138818637和https://blog.csdn.net/2301_80653026/article/details/138867371),我们在接下来要讲解的锁策略内容,对......
  • 自旋锁与互斥锁的区别
    编程世界中,锁用来保护一个资源不会因为并发操作而引起冲突,导致数据不准确。常见的锁有互斥锁、读写锁、自旋锁、信号量、分布式锁等等。这里仅仅讨论互斥锁和自旋锁的区别。自旋锁是当资源被占用时,锁逻辑循环判断资源是否可用,而不是把进程挂起,直到资源可用。自旋锁采用的是,循......
  • 线程概念浅谈
    1.为什么要有线程我们知道一个集成应用场景需要多个进程同时调度执行各自的功能,那么多进程的本质就是产生多个执行流,每个执行流执行不同的代码和功能,但是一个进程由PCB(task_struct)、进程地址空间、页表、文件描述符表等资源组成,是一个资源集合,创建的开销较大,那么为了满足用户的......
  • Java三种方法实现多线程,继承Thread类,实现Runnable接口,实现Callable接口
    目录线程:继承Thread类:实现Runnable类:实现Callable接口:验证多线程:线程:定义:进程可以同时执行多个任务,每个任务就是线程。举个例子:一个Java程序,如果同时有两个循环同时进行,就是线程。再比如,你用百度网盘,边看视频,边下载。继承Thread类:步骤写在代码里的classmythrea......
  • 如何进行接口优化?如何进行接口优化?多线程的核心参数有哪些?SpringCloud使用了哪些组件?
    在快速迭代的技术领域中,持续地回顾与总结项目经验不仅是个人成长的催化剂,也是智慧积累的关键环节,本次知识积累旨在深入剖析如何进行接口优化?如何进行接口优化?多线程的核心参数有哪些?SpringCloud使用了哪些组件?一、如何优化SQL?优化SQL语句以提高查询效率和性能是一项......
  • 3个进程实现共享内存、信号量、互斥访问
    V1.02024年5月28日发布于博客园题目设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互......
  • Java高并发编程详解:深入理解并发核心库(Java高并发编程详解:多线程与架构设计姊妹篇) (Ja
    我的阅读笔记:并发核心库概览:首先介绍Java并发核心库的组成,包括java.util.concurrent包下的主要类和接口,以及它们之间的关系。线程池技术:详细讲解Java中的线程池技术,包括线程池的创建、配置、使用以及调优。介绍不同类型的线程池(如FixedThreadPool、CachedThreadPool等)以及它们......
  • 系统编程练习题---利用共享内存和信号量集,完成两个进程之间的互斥通信
    目录题目解析代码展示process_A.cprocess_B.cprocess_C.c结果展示重要知识点记录题目设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程......
  • 29.并发编制【六】守护线程与锁
    【一】守护线程守护线程是在后台运行并依赖于主线程或非守护线程的存在1)主线程死亡,子线程存活主线程结束后不会立马结束,而是等待其他子线程结束之后结束fromthreadingimportThreadimporttimedefwork(name):print(f'{name}开始')time.sleep(2)print(f......