首页 > 其他分享 >多线程并发锁分类以及简单实例

多线程并发锁分类以及简单实例

时间:2024-07-21 09:07:12浏览次数:8  
标签:int lock 并发 实例 线程 pthread mutex 多线程 spinlock

多线程并发锁

包括自旋锁、互斥锁、无锁

POSIX接口

posix接口提供linux下线程操作库,posix默认生成的线程占用8M空间

  1. pthread_create线程创建函数

    pthread_create(pthread_t *th, const pthread_attr_t *attr, void *(* func)(void *), void *arg) // func是函数指针,是线程要调用的函数,arg是给调用函数传的参数
    

互斥锁mutex

线程试图访问被锁资源时,线程会被阻塞。锁释放的时候,会唤醒所有该锁上阻塞的线程。适用于锁的内容较多的情况,比如队列

pthread_mutex_t mutex; // 声明互斥量
pthread_mutex_init(&mutex, NULL); // 默认初始化
ptherad_mutex_lock(&mutex); // 加锁
ptherad_mutex_lock(&mutex); // 解锁

自旋锁spinlock

自旋锁会一直去尝试获取锁,相当于一个while循环获取。适用于锁的内容很少比如变量,使用自选锁,等待代价小于线程切换。此时cpu会发生空转。

pthread_spinlock_t spinlock; // 声明自旋锁
pthread_spin_init(&spinlock, PTHERAD_PROCESS_PRIVATE); // 默认初始化
ptherad_spin_lock(&spinlock); // 加锁
ptherad_spin_lock(&spinlock); // 解锁

原子操作-无锁

原子操作解决对应变量需要加锁的问题,原子操作能够将变量的指令变为单条CPU指令,这样就能够解决线程之间不同步的问题。原子操作的速度更快。

int inc(int* value, int add){
    int old;
    // volatile指示编译器不要对变量进行优化
    __asm__ volatile(
        "lock; xaddl %2, %1"
        : "=a" (old)
        : "m" (*value), "a" (add)
        : "cc", "memory"
    );
}

CAS

cas指的是Compare-And-Swap原子操作,能够保证并发线程对共享数据安全访问和修改。

实现思路

compare用于检测内存地址当前值是否与期望值相等,swap如果期望值等于当前值,则将当前值作为新值。

实现方式

void cas(int *ptr, int expected, int desired) {
    __asm__ volatile (
        "lock; cmpxchg %2, %0\n" // 使用LOCK前缀的cmpxchg指令
        : "+m" (*ptr), "+a" (expected) // 操作数约束
        : "r" (desired) // 操作数约束
        : "memory" // 标记内存操作
    );
}

标签:int,lock,并发,实例,线程,pthread,mutex,多线程,spinlock
From: https://www.cnblogs.com/solicit/p/18314159

相关文章

  • 如何忽略或绕过导致 NoneType 不可迭代对象的实例
    我正在尝试解析Edgar数据库中10K的部分,当我运行以下代码时,#pipinstalledgartoolsimportpandasaspdfromedgarimport*#TelltheSECwhoyouareset_identity("[email protected]")filings2=get_filings(form='10-K',amendments=False,......
  • 将AWS RDS MySQL实例从存储未加密改为加密的方案
    问题描述:因为AWSRDS官方文档【1】中已经明确说明,MySQLRDS的存储为EBS卷,用KMS进行RDS加密有如下限制:您只能在创建RDS的时候,选择加密。对于已经创建的RDS实例,您无法将为加密的实例,直接改为加密实例。(文档【1】中的AmazonRDS加密的数据库实例的限制部分)因此,对于一个我们已......
  • 深入理解Shell脚本判断符号:实例讲解与最佳实践
    引言在Shell脚本编程中,判断符号扮演着至关重要的角色。它们允许我们进行条件测试、比较值,并根据这些测试的结果来控制脚本的执行流程。本文将深入探讨Shell脚本中常用的判断符号,并通过实例来展示它们的用法。1.文件测试运算符文件测试运算符用于检查文件的各种属性。以......
  • 项目管理_XX市XX区人民医院HRP信息系统建设项目(人力资源管理)实例
    项目管理_XX市XX区人民医院HRP信息系统建设项目(人力资源管理)实例本文将通过XX市XX区人民医院HRP信息系统建设项目实例来论述人力资源管理在其中的作用。人力资源管理定义信息系统项目管理师教材定义:项目人力资源管理的目的是根据项目需要规划并组建项目团队,对团......
  • java进阶(面向对象实例代码)
    1.抽象类和接口抽象类示例abstractclassAnimal{abstractvoidmakeSound();voidsleep(){System.out.println("Sleeping...");}}classDogextendsAnimal{@OverridevoidmakeSound(){System.out.println("Bark&......
  • 中介者模式详解:概念、优点及实例
    目录中介者模式中介者模式结构中介者模式适用场景中介者模式优缺点练手题目题目描述输入描述输出描述题解中介者模式中介者模式是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。......
  • 5分钟解锁python多线程
    以下是一个使用Python多线程的简单示例代码:importthreadingdefprint_numbers():foriinrange(1,6):print(i)defprint_letters():forletterin['A','B','C','D','E']:print(letter)if__nam......
  • Spring Book Club + java查询数据库 + 百万数据 + 同步Elasticsearch(ES)+ 多线程 + Fei
    @FeignClient(name="bwie-elastic")publicinterfaceEsFeign{@PostMapping("/add")publicResultadd(@RequestBodyArrayList<ResourceInfo>resourceInfo);}@RestControllerpublicclassUserControllerimplementsApplica......
  • java多线程
    程序,进程,线程,并行,并发程序是静态的,进程process是动态的一个进程至少有一个线程多线程程序优点提高应用程序的响应提高CPU利用率改善程序结构并行parallel,指两个或多个事件在同一时刻发生并发concurrency,两个或多个事件在同一个时间段内发生,宏观上是多个进程同步进行......
  • 【视频讲解】PCA主成分分析原理及R语言2实例合集|附代码数据
    原文链接:https://tecdat.cn/?p=37034原文出处:拓端数据部落公众号 分析师:RuoyiXu在数据分析的浩瀚宇宙中,我们时常面对多变量的数据海洋。这些变量虽然信息丰富,却也给处理带来了巨大挑战:工作量激增,而关键信息却可能淹没在繁杂的数据之中。为了有效减少指标数量同时尽可能保留原......