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

线程互斥锁

时间:2024-05-23 13:29:17浏览次数:12  
标签:task money list 互斥 线程 import 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,互斥,线程,import,main
From: https://www.cnblogs.com/zenopan101861/p/18208228

相关文章

  • 线程模块
    概述该模块基于pthread实现。sylar说,由于c++11中的thread也是由pthread封装实现的,并且没有提供读写互斥量,读写锁,自旋锁等,所以自己封装了pthread。包括以下类:Thread:线程类,构造函数传入线程入口函数和线程名称,线程入口函数类型为void(),如果带参数,则需要用std::bind进行绑定。线......
  • 浅谈一下C#和java的线程不同点
    C#和Java在线程处理方面有一些显著的区别,这些区别主要体现在线程的创建、管理和生命周期控制上。以下是一些主要的区别:线程的创建和管理Java:Java中线程的创建通常是通过继承Thread类或实现Runnable接口来实现的。Java提供了线程组(ThreadGroup)的概念,允许将线程组织在一起......
  • 进程间通信(管道),多线程
    Ⅰ进程间通信(管道)【一】引入借助于消息队列,进程可以将消息放入队列中,然后由另一个进程从队列中取出。这种通信方式是非阻塞的,即发送进程不需要等待接收进程的响应即可继续执行。multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的进程间通信(IPC)方式二......
  • 27.并发编制【四】互斥锁与队列
    【一】互斥锁(进程间同步)1)概念一种用于多线程编程中控制对方共享资源访问机制为当前进程或线程添加额外的限制,限制当前时间段只能由当前进程使用,当前进程使用完成后才能其他进程继续使用其可保证同一时间只有一个进程在执行关键代码段,从而保证了数据的安全性2)多个进程......
  • Java实验五: Java多线程程序设计(头歌)
    一、线程接力编写一个应用程序,除了主线程外,还有三个线程:first、second和third。first负责模拟一个红色的按钮从坐标(10,60)运动到(100,60);second负责模拟一个绿色的按钮从坐标(100,60)运动到(200,60)。third线程负责模拟一个蓝色的按钮从坐标(200,60)运动到(300,60)。第一步以下是ideajdk1.8的教......
  • 多线程
    【一】什么是线程在操作系统中,每一个进程都有一块内存空间地址,你的程序就泡在这块内存地址上不可能一个程序只有一个进程在处理所有数据和逻辑于是就有了线程这个概念:在进程内部开设的处理程序的进程操作系统-->运行一个程序叫进程--->进程里面又开了一个进程--->改名叫......
  • 关于线程池优雅关闭
    使用线程池的问题程序关闭时(eg.上线),线程池中的任务会丢失(内存中)。线程池优雅关闭利用Spring中ContextClosedEvent:关闭程序触发的事件,在使用线程池的地方,可以将线程池注册到ThreadPoolShutdownListener中,然后在程序关闭时,ThreadPoolShutdownListener会监听ContextClosedEvent事......
  • 互斥锁,IPC机制,队列,生产者消费者模型
    Ⅰ互斥锁【一】什么是互斥锁互斥锁其实就是一种锁。为当前进程或线程添加额外的限制限制当前时间段只能由当前进程使用,当前进程使用完成后才能其他进程继续使用其作用是保证在同一时刻只有一个线程在访问共享资源,从而避免多个线程同时读写数据造成的问题。互斥锁的基本原......
  • 进程&线程、并行&并发
    什么是进程开发写的代码我们称为程序,那么将开发的代码运行起来。我们称为进程。通俗解释当我们运行一个程序,那么我们将运行的程序叫进程。专业解释进程是申请一块内存空间,将数据放到内存空间中去,是申请数据的过程是最小的资源管理单元进程是线程的容器程序与进......
  • 小米面试:如何实现优先级线程池?
    我们知道,线程池中的所有线程都是由统一的线程工厂来创建的,当我们指定线程工厂时,线程池中的所有线程会使用我们指定的线程工厂来创建线程;但如果没有指定线程工厂,则会使用默认的线程工厂DefaultThreadFactory来创建线程,核心源码如下:DefaultThreadFactory(){@SuppressWarnin......