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

【6.2】线程的互斥锁

时间:2024-01-23 14:35:22浏览次数:30  
标签:__ money list 互斥 线程 6.2 import main

【一】问题

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

money = 100


def task():
    global money

    # 模拟获取到车票信息
    temp = money

    # 模拟网络延迟
    time.sleep(2)

    # 模拟购票
    money = temp - 1


def main():
    t_list = []
    for i in range(100):
        t = Thread(target=task)
        t.start()
        t_list.append(t)

    for t in t_list:
        t.join()

    # 所有子线程结束后打印 money
    print(money)


if __name__ == '__main__':
    main()

    # 99

【二】解决办法

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

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


def task():
    global money

    # 数据发生改变之前加锁
    mutex.acquire()

    # 模拟获取到车票信息
    temp = money

    # 模拟网络延迟
    time.sleep(0.6)

    # 模拟购票
    money = temp - 1

    # 数据发生改变后解锁
    mutex.release()


def main():
    t_list = []
    for i in range(100):
        t = Thread(target=task)
        t.start()
        t_list.append(t)

    for t in t_list:
        t.join()

    # 所有子线程结束后打印 money
    print(money)


if __name__ == '__main__':
    main()

    # 0

标签:__,money,list,互斥,线程,6.2,import,main
From: https://www.cnblogs.com/dream-ze/p/17982393

相关文章

  • 【11.0】进程池和线程池
    【一】TCP实现并发的效果的原理每开设一个客户端,就会有一个服务端服务【1】服务端fromsocketimport*fromthreadingimportThreaddefserver_create(IP,PORT):server=socket()server.bind((IP,PORT))server.listen(5)whileTrue:......
  • 【10.0】线程queue
    【零】队列queue介绍queue队列:使用importqueue,用法与进程Queue一样queueisespeciallyusefulinthreadedprogrammingwheninformationmustbeexchangedsafelybetweenmultiplethreads.classqueue.Queue(maxsize=0)先进先出importqueueq=queue.Queue()......
  • 进程锁(互斥锁)
    进程锁(互斥锁)【一】什么是进程同步(互斥锁)互斥锁(Mutex)是一种用于多线程编程中控制对共享资源访问的机制。其作用是保证在同一时刻只有一个线程在访问共享资源,从而避免多个线程同时读写数据造成的问题。互斥锁的基本原理是在对共享资源进行访问前加锁,使得其他线程无法访问该......
  • 线程同步之信号量
    目录Semaphore信号量Semaphore与condition_variable的区别Semaphore信号量在C++中,可以使用std::Semaphore类来实现信号量。信号量可以用于控制对资源的访问,例如限制同时执行任务的线程数量。在C++11中,std::Semaphore类提供了以下常用函数:Semaphore():构造函数,创建一个信......
  • MySQL线程状态详解
    前言:我们常用showprocesslist或showfullprocesslist查看数据库连接状态,其中比较关注的是State列,此列表示该连接此刻所在的状态。那么你真的了解不同State值所表示的状态吗?下面我们参考官方文档来一探究竟。以MySQL5.7版本为例官方文档地址:https://dev.my......
  • QT笔记:多线程和信号槽
    QT笔记:多线程和信号槽多线程创建多线程有两种方法,一般推荐用moveToThread方法参考代码如下:mainwindow.h#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QApplication>QT_BEGIN_NAMESPACEnamespaceUi{classMainWindow;}QT_END_NAMES......
  • .NET 6 实现一个任务队列,且在不同线程中调用队列,队列始终都是串行执行
    在.NET6中,要实现一个任务队列,确保队列中的任务始终串行执行,即使它们是由不同线程调用的,你可以使用Channel<T>结合Task.Run或者更简单地使用BlockingCollection<T>与Task.Factory.StartNew或async/await模式。不过,为了保持代码的简洁性和现代性,我会推荐使用Channel<T>结合async/aw......
  • 线程池
    目录简单的线程池简单的线程池在C++11中,你可以使用 std::thread 和 std::mutex 等标准库来实现一个简单的线程池。以下是一个简单的示例代码:#include<iostream>#include<vector>#include<thread>#include<mutex>#include<queue>classThreadPool{private:......
  • java线程池-1
    1.概述Java线程的创建非常昂贵,需要JVM和OS(操作系统)配合完成大量的工作:必须为线程堆栈分配和初始化大量内存块,其中包含至少1MB的栈内存。需要进行系统调用,以便在OS(操作系统)中创建和注册本地线程。Java高并发应用频繁创建和销毁线程的操作将是非常低效的,而且是不被......
  • python 多线程multiprocessing
    该多线程,简单计算结果可以使用,在django里想并行处理多个实体进行计算不行,请自行验证importmultiprocessing#要在进程池中并行执行的任务函数defprocess_data(data):#执行任务的逻辑result=data*2returnresultif__name__=='__main__':#创......