当前位置: 首页 > news >正文

【PTHREAD】线程互斥与同步之自旋锁

1 自旋锁类型

typedef volatile int pthread_spinlock_t;

2 初始化与销毁自旋锁

int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
int pthread_spin_destroy(pthread_spinlock_t *lock);
  • PTHREAD_PROCESS_PRIVATE
  • PTHREAD_PROCESS_SHARED

3 自旋锁的加锁解锁

int pthread_spin_lock(pthread_spinlock_t *lock);
int pthread_spin_trylock(pthread_spinlock_t *lock);
int pthread_spin_unlock(pthread_spinlock_t *lock);

4 案例:自旋锁的使用

  • 源码

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <time.h>
    
    pthread_spinlock_t spinlock;
    
    void *start_routine_01(void *ptr)
    {
        printf("子线程(%lu)开始运行...\n", pthread_self());
        for (size_t i = 0; i < 3; i++)
        {
            pthread_spin_lock(&spinlock);
            printf("子线程(%lu)进入自旋锁\n", pthread_self());
            sleep(1);
            printf("子线程(%lu)离开自旋锁\n", pthread_self());
            pthread_spin_unlock(&spinlock);
        }
        return (void*)"9999";
    }
    
    void *start_routine_02(void *ptr)
    {
        printf("子线程(%lu)开始运行...\n", pthread_self());
        for (size_t i = 0; i < 3; i++)
        {
            pthread_spin_lock(&spinlock);
            printf("子线程(%lu)进入自旋锁\n", pthread_self());
            sleep(1);
            printf("子线程(%lu)离开自旋锁\n", pthread_self());
            pthread_spin_unlock(&spinlock);
        }
        return (void*)"9999";
    }
    
    int main(int argc, char const *argv[])
    {
        printf("主线程(%lu)开始运行...\n", pthread_self());
    
        pthread_spin_init(&spinlock, PTHREAD_PROCESS_PRIVATE);
        
        pthread_t thread_id_01;
        pthread_create(&thread_id_01, NULL, start_routine_01, NULL);
    
        pthread_t thread_id_02;
        pthread_create(&thread_id_02, NULL, start_routine_02, NULL);
    
        pthread_join(thread_id_01, NULL);
        pthread_join(thread_id_02, NULL);
    
        pthread_spin_destroy(&spinlock);
        printf("主线程(%lu)即将退出...\n", pthread_self());
        exit(EXIT_SUCCESS);
    }
    
  • 输出

    主线程(139684168165184)开始运行…
    子线程(139684168161024)开始运行…
    子线程(139684168161024)进入自旋锁
    子线程(139684159768320)开始运行…
    子线程(139684168161024)离开自旋锁
    子线程(139684168161024)进入自旋锁
    子线程(139684168161024)离开自旋锁
    子线程(139684168161024)进入自旋锁
    子线程(139684168161024)离开自旋锁
    子线程(139684159768320)进入自旋锁
    子线程(139684159768320)离开自旋锁
    子线程(139684159768320)进入自旋锁
    子线程(139684159768320)离开自旋锁
    子线程(139684159768320)进入自旋锁
    子线程(139684159768320)离开自旋锁
    主线程(139684168165184)即将退出…

相关文章:

  • 猿创征文|那些年我们追过的那些技术
  • QT静态成员函数访问和操作UI对象
  • 计算机组成原理学习笔记:计算机系统的层次结构
  • 猿创征文|工作中遇到技术盲区后的自我成长
  • SpringCloud 三种服务调用方式,你学会了吗?
  • 路由-hash和history模式的区别
  • 剑指:二叉树有关题目
  • 四天拿捏SpringSecurity?这份阿里架构师编写的理论与实战结合的学习笔记到底有多强
  • Hive3.1.2的HQL执行过程
  • 浅谈前端微服务背景及Micro-app的使用
  • 【Notepad】Notepad++ 安装XML/Json插件,格式化xml/json文件
  • 3分钟学会批量混合查询多家快递的物流信息
  • ElasticSearch Query DSL(二)
  • 【重识云原生】第六章容器6.1.7.1节——Docker核心技术cgroups综述
  • 关于C# HttpClient 的用法及相关问题的解决方法
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • DataBase in Android
  • Elasticsearch 参考指南(升级前重新索引)
  • FastReport在线报表设计器工作原理
  • gulp 教程
  • If…else
  • JS 面试题总结
  • js面向对象
  • Python 基础起步 (十) 什么叫函数?
  • sessionStorage和localStorage
  • Sublime text 3 3103 注册码
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 从重复到重用
  • 前端面试之闭包
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 前嗅ForeSpider教程:创建模板
  • 悄悄地说一个bug
  •  一套莫尔斯电报听写、翻译系统
  • 正则表达式小结
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​secrets --- 生成管理密码的安全随机数​
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #define,static,const,三种常量的区别
  • %check_box% in rails :coditions={:has_many , :through}
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (02)Hive SQL编译成MapReduce任务的过程
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (十)T检验-第一部分
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转载)(官方)UE4--图像编程----着色器开发
  • (转载)OpenStack Hacker养成指南
  • .aanva
  • .htaccess 强制https 单独排除某个目录
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET MVC第五章、模型绑定获取表单数据