小例子:实现互斥锁,自旋锁

2023-11-12

小例子实现互斥锁,自旋锁

在多线程并发访问临界区时,使用上面三种操作,可以实现并发访问。
首先创建是个线程

   for(i = 0;i<THREAD_COUNT;i++)
    {
        pthread_create(&threadid[i],NULL,thread_callback,&count);//返回线程的ID传回的是地址
    }

其次编辑回调函数,回调函数实现的是让pcount的值达到1000000,达到一百万的过程是十个线程的共同作用结果。

void thread_callback(void *arg)
{
    int *pcount = (int *)arg;
    int i = 0;
    while(i++ <100000)
    {
        (*pcount)++;
        pthread_mutex_unlock(&mutex);

        inc(pcount,1);
        usleep(1);
    }
}

在实现的过程中,会出现打断,达到预期效果

  1. 自旋锁实现临界区访问
//创建自旋锁
pthread_spinlock_t spinlock;
//初始化自旋锁
pthread_spinlock_init(&spinlock);
//开锁
pthread_spin_lock(&lock);
//关锁
pthread_spin_unlock(&lock);
void thread_callback(void *arg)
{
    int *pcount = (int *)arg;
    int i = 0;
    while(i++ <100000)
    {
        pthread_spin_lock(&mutex);
        (*pcount)++;
        pthread_spin_unlock(&mutex);
        usleep(1);
    }
}

自旋锁过程是:自旋等待,访问,返回。适用于自旋锁的条件是锁中执行的内容尽可能的少。
2. 互斥锁
互斥锁的实现与自旋锁类似,

//创建互斥锁
pthread_mutex_t mutex;
//初始化互斥锁锁
pthread_mutex_init(&mutex,NULL);;
//开锁
pthread_mutex_lock(&mutex);
//关锁
pthread_mutex_unlock(&lock);
        pthread_mutex_lock(&mutex);
        (*pcount)++;
        pthread_mutex_unlock(&mutex);

互斥锁实现时,当发现临界区上锁,无法访问,应当让出CPU进入阻塞状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小例子:实现互斥锁,自旋锁 的相关文章

  • 九、Linux系统编程:线程池编程

    9 线程池编程 创建线程要花费昂贵的资源和时间 如果任务来了才创建线程那么响应时间会变长 而且一个进程能创建的线程数有限 为了避免这些问题 在程序启动的时候就创建若干线程来响应处理 它们被称为线程池 里面的线程叫工作线程 9 1 概念 线程
  • 01LinuxC线程学习之线程概念,简述与进程区别和查看LWP轻量级线程号(不是PID也不是TID))

    1 线程 1 1 线程概念 1 线程概念 每个线程有各自的PCB 但没有独立的地址空间 共享 注 该地址空间指的是以进程为单位 不是指栈 而进程拥有独立地址空间 拥有PCB 2 LWP light weight process 轻量级的进程
  • 文件写入操作编程(Linux系统编程)

    write函数 man手册的相关介绍 代码实现 include
  • Linux·C/C++主线程对子线程的影响

    这篇文章主要介绍了简单了解C语言中主线程退出对子线程的影响 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 需要的朋友可以参考下 对于程序来说 如果主进程在子进程还未结束时就已经退出 那么Linux内核会将子进程
  • Linux:进程等待wait函数&阻塞

    进程等待的作用 父进程在它的执行代码中调用进程等待的方法 等待子进程退出 防止子进程变成僵尸进程 也就是说 进程等待是父进程调用某个接口进行等待 父进程等待子进程退出回收子进程的资源 防止子进程变成僵尸进程 进程等待的方法 如何让父进程进行
  • Linux·直接I/O原理

    在介绍直接 I O 之前 先来介绍下直接I O这种机制产生的原因 毕竟已经有了缓存I O Buffered I O 那肯定能够像到缓存I O有缺陷吧 就按照这个思路来 什么是缓存 I O Buffered I O 缓存 I O 又被称作标准
  • 10LinuxC线程学习之pthread_detach函数,错误返回值分析及其案例

    1 pthread detach函数 int pthread detach pthread t thread 功能 1 实现线程分离 不再受主线程管理 由系统接任 线程结束后 其退出状态不由其他线程获取 而直接自己自动释放 网络 多线程服务
  • 面试官都在问

    面试官都在问 Linux命令mpstat详解 1 mpstat的基本用法 mpstat的全称为Multiprocessor Statistics 是一款常用的多核CPU性能分析工具 用来实时查询每个CPU的性能指标 以及所有CPU的平均指标
  • Linux:死锁与解决方法

    死锁 死锁 指在一组进程中的各个进程均占有不会释放的资源 但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态 死锁现象 现象1 如果执行流加锁完毕后 不进行解锁则会造成死锁 上篇所述 现象2 线程A获取了1锁 线程B获取了2
  • Linux中的线程(一)-- 线程的创建

    什么是线程 Linux 中的线程被称为 轻量级进程 Lightweight Process LWP 它是在进程内部运行的一种 子进程 与传统的进程不同 线程共享相同的虚拟地址空间和其他资源 例如打开的文件 信号处理程序和用户 ID 等 线程
  • 02守护进程学习之创建守护进程的七步骤及其分析

    02守护进程学习之创建守护进程的七步骤及其分析 与守护进程相关的文章 01守护进程学习之会话的概念和创建会话 包含Linux下相应id的总结一览 02守护进程学习之创建守护进程的七步骤及其分析 03守护进程学习之创建守护进程的代码例子 1
  • 八、Linux编程之递归遍历目录

    八 Linux编程之递归遍历目录 目录 八 Linux编程之递归遍历目录 一 步骤分析 二 isFile 函数 三 isDir 函数 int sprintf char str const char format 四 main 主函数 五 运
  • 基于TCP的Socket网络编程

    前言 Socket通信是基于TCP IP协议的通信 在工作和做项目中应用非常广 下面来介绍下Socket网络编程 Socket的介绍 首先 在Socket网络编程中我们要了解两个重要的东西 ip和端口号 一台拥有IP地址的主机可以提供许多服
  • Linux·DNS协议、ICMP协议、NAT技术

    目录 DNS协议 DNS背景 编辑域名简介 域名解析过程 使用dig工具分析DNS过程 ICMP协议 ICMP功能 ICMP协议格式 编辑ping命令 一个值得注意的坑 traceroute命令 NAT技术 NAT技术背景 NAT IP转换
  • Linux系统编程之信号

    本篇博客所回顾的知识 学习目标 一 信号介绍 从图中可以看出 信号的优先级是高于普通操作的 出现信号就一定要先执行完才能继续做之前的事情 注意 如何查看信号都有哪些呢 答 用命令 kill l 来do 注意 每一个进程都有一个唯一的定时器a
  • Linux之文件上传和下载(两种方式)

    前言 由于工作需要 整理了一下Linux与Windows之间文件的上传和下载方式 一 rz上传 sz下载文件 rz是将Windows系统上的文件上传到Linux下 sz是将Linux系统下的文件上传到Windows下 1 rz案例 输入rz
  • GDB调试的基本使用、GDB调试多进程

    1 编译时加选项 g 生成具有调试信息的程序 gcc g test c o test 2 启动GDB 1 启动GDB gdb test 2 设置运行时参数 主函数中可接收运行时参数 set args 设置运行时参数 如set args 10
  • Linux进程编程(PS: exec族函数、system、popen函数)

    目录 1 进程相关概念 程序和进程 查看系统中的进程 ps指令 top指令 进程标识符 使用getpid 获取 父进程 子进程 2 创建进程fork 进程创建发生了什么 C程序的存储空间如何分配 3 创建进程vfork 区别fork 4 进
  • Linux·进程权限控制

    Linux系统的安全性得益于其进程权限和文件权限的控制机制 今天抽空梳理下Linux下的进程权限控制相关的文件权限涉及一点 首先明确四个名词 真实用户ID real ID 有效用户ID effective ID 保存用户ID Saved I
  • 终端连接控制(stty的编写)

    终端连接控制 stty的编写 一 背景 文件与目录在之前已经学习过了 文件中包含着数据 这些数据可以被读出 写入 也可以用以操作 但文件不仅仅是计算机唯一的数据来源 计算机的数据还可以来自于许多的外部设备 比如扫描仪 照相机 鼠标等输入设备

随机推荐