锁与原子操作
锁与原子操作
锁
以自增操作为例子:
void *func(void *arg) {int *pcount = (int *)arg;int i = 0;//while (i ++ < 100000) {(*pcount) ++; // 并不会到达100000usleep(1);}
}int main(){int i = 0;for (i = 0;i < THREAD_COUNT;i ++) {pthread_create(&thid[i], NULL, func, &count);}for (i = 0;i < 100;i ++) {printf("count --> %d\n", count);sleep(1);}
}
如果有两个线程对i=20进行自增:idx++
正常是这样:
从内存加载到寄存器 =》 寄存器自增 =》 从寄存器加载到内存
但可能是:
在线程1切换2时,没问题,在线程2切换线程1时,线程1栈中保存的寄存器的值INC是20,写入内存就是21,而不是22.
如果开启O3优化,编译器会将自增转换为原子操作(后面再将)
那我们在编码层怎么做:
- 加锁(对临界资源是否需要加锁,看它在汇编层面是否是原子操作 )
- 直接把操作变成原子操作
互斥锁、自旋锁、原子操作
- 锁,就是对临界资源加锁,这里加一把互斥锁
void *func(void *arg) {int *pcount = (int *)arg;int i = 0;while (i ++ < 100000) {pthread_mutex_lock(&mutex); (*pcount) ++;pthread_mutex_unlock(&mutex);usleep(1);}
}
但其实,这里更应该用自旋锁
- 自旋锁:和互斥锁使用一样的,互斥锁在哪用,自旋锁就在哪里用(不让出cpu,一直等着锁被释放)
使用场景:
- 临界资源复杂的,有系统调用的操作用互斥锁,简单的用自旋(因为等的时间短,消耗的资源还少于线程切换的资源),
- 有系统调用的就别用自旋了,文件的读写,只允许一个线程访问的,用互斥锁,自增操作,队列读取可以用自旋锁
- 操作简单,且cpu提供了指令集的,用原子操作
- 原子操作
把三条指令(读、自增、写)变成一条:xaddl
原子操作需要cpu指令集的支持,比如这里的xaddl
int inc(int *value, int add) {int old;__asm__ volatile (// xaddl 第2个参数加第1个参数并把值存储到第一个参数;lock,锁cpu操作内存的总线// 锁总线、锁缓存的平时也用不到,这里不赘述了"lock; xaddl %2, %1;" : "=a" (old) // old:第0个参数: "m" (*value), "a" (add) // value第一个参数,add是第二个参数: "cc", "memory");return old;
}void *func(void *arg) {int *pcount = (int *)arg;int i = 0;while (i ++ < 100000) {inc(pcount, 1); // 原子操作usleep(1);}
}
而cas是原子操作的一种,也就是cpu指令集中的一个指令:compare and swap,先有比较再有赋值
if (a==b){ // comparea=c; // swap
}
这个就是cmpxchg(a,b,c),用在单例模式中:
if (instance == null){instance = malloc(sizeof(object));
}
原子操作记住常用的就行 自增,自减,加减乘除,cas
cpu亲缘性:
在Linux内核中,都是通过task_struct进行调度的,为了避免一个task_struct被切换到其他核(减少系统调用),可以使用系统函数sched_setaffinity() 将一个或多个task_struct绑定到特定的核上
tip1:如果fork指定数量的子进程:
比如说我要创建6个子进程,如果fork()3次,那就是8个了(2,4,8),可以通过以下方式创建:
int i = 0;int num = sysconf(_SC_NPROCESSORS_CONF); // 获取cpu核心数量pid_t pid = 0;for (i = 0;i < num/2;i ++) {pid = fork();if (pid <= (pid_t)0) { // 如果是子线程(=0),就退出break;}}
tip2:以下内存我没深入理解,放在这里以后补充
线程私有空间:pthrerad_key
线程是进程的一个实体(),是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
线程所独享的资源有:程序计数器、寄存器、栈、状态字,共享堆内存
为什么线程要有私有数据:
比如不同线程监听不同的端口,端口的数据,就属于线程的私有空间,不应该被其他线程读取,而线程的私有数据是通过一个Key结构体来实现的
setjmp/longjmp:函数间的跳转,实现try-catch的核心,要实现try-catch,还需线程私用空间
相关文章:
锁与原子操作
锁与原子操作 锁 以自增操作为例子: void *func(void *arg) {int *pcount (int *)arg;int i 0;//while (i < 100000) {(*pcount) ; // 并不会到达100000usleep(1);} }int main(){int i 0;for (i 0;i < THREAD_COUNT;i ) {pthread_create(&thid…...
Prometheus Pushgetway讲解与实战操作
目录 一、概述 1、Pushgateway优点: 2、Pushgateway缺点: 二、Pushgateway 架构 三、实战操作演示...
常见字符串函数的使用,你确定不进来看看吗?
👦个人主页:Weraphael ✍🏻作者简介:目前是C语言学习者 ✈️专栏:C语言航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&a…...
Elasticsearch:在搜索中使用衰减函数(Gauss)
在我之前的文章 “Elasticsearch:使用 function_score 及 script_score 定制搜索结果的分数” 我有讲到 Decay 函数在搜索中的使用。在那里,我有一个例子讲述在规定的时间里,分数不进行衰减。同一的函数也可以适用于地理位置的搜索。位置搜索…...
微信小程序 Springboot英语在线学习助手系统 uniapp
四六级助手系统用户端是基于微信小程序端,管理员端是基于web端,本系统是基于java编程语言,mysql数据库,idea开发工具, 系统分为用户和管理员两个角色,其中用户可以注册登陆小程序,查看英语四六级…...
LeetCode算法题解——双指针2
LeetCode算法题解——双指针2第五题思路代码第六题思路代码第七题思路代码这里介绍双指针在数组中的第二类题型:两端夹击。 第五题 977. 有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的…...
线性杂双功能peg化试剂——HS-PEG-COOH,Thiol-PEG-Acid
英文名称:HS-PEG-COOH,Thiol-PEG-Acid 中文名称:巯基-聚乙二醇-羧基 HS-PEG-COOH是一种含有硫醇和羧酸的线性杂双功能聚乙二醇化试剂。它是一种有用的带有PEG间隔基的交联或生物结合试剂。巯基或SH、巯基或巯基选择性地与马来酰亚胺、OPSS、…...
Linux第三讲
目录 三、 磁盘和文件管理和使用检测和维护 3.1 磁盘目录 3.2 安装软件 3.2.1 rpm命令 3.2.2 克隆虚拟机 3.2.3 yum或压缩包方式安装jdk 3.2.4 使用虚拟机运行SpringBoot项目 3.2.5 安装mysql80(57) 3.2.6 运行web项目 3.2.7 安装tomcat 三、 …...
SpringBoot07:SpringSecurity
Security是什么? 是一个安全框架。可以用来做认证和授权 官网:Spring Security SpringSecurity环境搭建 1、创建一个新的project 2、导入thymeleaf依赖 <dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf…...
C++ 浅谈之 STL Vector
C 浅谈之 STL Vector HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是 C 浅谈系列,收录在专栏 C 语言中 😜😜😜 本系列阿呆将记录一些 C 语言重要的语法特性 🏃&…...
【个人作品】非侵入式智能开关
一、产品简介 一款可以通过网络实现语音、APP、小程序控制,实现模拟手动操作各种开关的非侵入式智能开关作品。 非侵入式,指的是不需要对现有的电路和开关做任何改动,只需要将此设备使用魔术无痕胶带固定在旁边即可。 以下为 ABS 材质的渲…...
数据存储技术复习(三)未完
module4智能存储系统是功能丰富且可提供高度优化的I/o处理能力的RAID阵列。请绘制智能存储系统架构,并说明其各个关键组件的主要功能。前端缓存后端物理磁盘2.智能存储系统中,使用缓存进行的写入操作与直接写入到磁盘相比,可以带来…...
ThinkPHP数据库迁移工具
安装 composer require topthink/think-migration 创建迁移工具文件 //执行命令,创建一个操作文件,一定要用大驼峰写法,如下 php think migrate:create AnyClassNameYouWant //执行完成后,会在项目根目录多一个database目录,这里面存放类库操作文件 //文件名类似/database/m…...
代理模式(Proxy Pattern)
代理模式定义: 提供了对目标对象另外的访问方式;即通过代理对象访问目标对象。举个例子:猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰和孙悟空都实现了这个接口ÿ…...
Elasticesearch内存详解
1.ES基本概念 为了更好的理解内存,我们先看一下ES的基本概念。 1.1 cluster 集群 多个节点组合在一起就形成了一个集群,在每个ES节点中,我们可以通过配置集群的名称来使各个节点组合在一起,成为一个集群。当某些节点的集群名称一样,ES会自动根据配置文件中的地址找到这些…...
SpringCloud之断路器聚合监控
一、Hystrix Turbine简介 看单个的Hystrix Dashboard的数据并没有什么多大的价值,要想看这个系统的Hystrix Dashboard数据就需要用到Hystrix Turbine。Hystrix Turbine将每个服务Hystrix Dashboard数据进行了整合。Hystrix Turbine的使用非常简单,只需要…...
凭借这份《2022测试八股文》候选者逆袭面试官,offer拿到手软
《2023测试面试八股文》800 道软件测试面试真题,高清打印版打包带走,横扫软件测试面试高频问题,涵盖测试理论、Linux、MySQL、Web 测试、接口测试、App 测试、Python、Selenium、性能测试、LordRunner、计算机网络、数据结构与算法、逻辑思维…...
【i2c协议介绍】
文章目录协议简单介绍五种速度模式master/slave和transmitter/receiver关系第一种情况:master作为transmitter,slave作为receiver第二种情况:当master作为receiver,slave作为transmitteri2c基本信号start产生stop信号数据传输有效…...
167. 两数之和 II - 输入有序数组
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 < index1 < index2 < numbers…...
编译与链接------《程序员的自我修养》
本篇整理于《程序员的自我修养》一书中编译与链接相关知识,整理的目的是为了更加深入的了解编译于链接的更多底层知识,面对程序运行时种种性能瓶颈我们束手无策。我们看到的是这些问题的现象,但是却很难看清本质,所有这些问题的本质就是软件运…...
5分钟搞懂 强缓存与协商缓存
Ⅰ、http缓存 HTTP 缓存策略 分为 > 「强制缓存」 和 「协商缓存」 为什么需要 HTTP 缓存 呢 ? 👇 直接使用缓存速度 >> 远比重新请求快 缓存对象有那些呢 ?👇 「图片」 「JS文件」 「CSS文件」 等等 文章目录Ⅰ、http缓存Ⅱ…...
Ts笔记第一天
文章目录安装 ts运行环境 nodeTS类型数字 、字符串 和布尔类型字面量any 和unknown类型断言void和neverobjectArraytuple 元组enum 枚举安装 ts运行环境 node node-v看版本号 2. 安装ts -g全局安装 npm i -g typescript // 这里全局安装 -s安装无法使用tsc 创建一个01.ts文…...
Android 12 Activity启动流程
Android 12 Activity启动过程 参考文献: startActivity启动过程分析 Activity启动流程(Android 12) 概述 Activity启动发起后,是通过Binder最终交由system进程中的AMS来完成。 一、启动流程 frameworks/base/core/java/android/app/Activity.java f…...
VCS®/VCSi™User Guide
VCS是一种高性能、高容量的Verilog模拟器,它将先进的高级抽象验证技术集成到一个开放的本地平台中。VCS是一个编译代码模拟器。它使您能够分析、编译和模拟Verilog、SystemVerilog、OpenVera和SystemC设计描述。它还为您提供了一组模拟和调试功能,以验证…...
MongoDB简介及SpringBoot整合
一、概述MongoDB中的记录是一个文档,它是一个数据结构组成 字段和值对。MongoDB文档类似于JSON。对象。字段的值可能包括其他文档、数组、 和文档数组:数据库(Database):和关系型数据库一样,每个数据库中有…...
读书思考:步步惊心的《技术陷阱》
《技术陷阱》这本书450页,43万字之巨,信息量密密麻麻,采集的资料极其丰富,复习了一遍大停滞、大分流、大平衡、大逆转时代,并展望未来。看完了有很多想法,随手写了下来,希望不是蹭热点。&#x…...
求你了,不要再在对外接口中使用枚举类型了!
最近,我们的线上环境出现了一个问题,线上代码在执行过程中抛出了一个IllegalArgumentException,分析堆栈后,发现最根本的的异常是以下内容: java.lang.IllegalArgumentException: No enum constant com.a.b.f.m.a.c.A…...
Java开发学习(四十六)----MyBatisPlus新增语句之id生成策略控制及其简化配置
在前面有一篇博客:Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发,我们在新增的时候留了一个问题,就是新增成功后,主键ID是一个很长串的内容。 我们更想要的是按照数据库表字段进行自增…...
章鱼哥听歌
uboot环境变量 以下所有的命令,都在串口工具进行执行 ubifsmount- mount UBIFS volume ubifsumount- unmount UBIFS volume ums - Use the UMS [USB Mass Storage] usb - USB sub-system usbboot - boot from USB device version - print monit…...
软件测试电商项目实战(写进简历没问题)
前言 说实话,在找项目的过程中,我下载过(甚至付费下载过)N多个项目、联系过很多项目的作者,但是绝大部分项目,在我看来,并不适合你拿来练习,它们或多或少都存在着“问题”ÿ…...
免费做四年级题的网站/百度地图导航2022最新版
环境变量操作命令1、修改环境变量2、新建环境变量3、删除环境变量1、修改环境变量 环境变量的操作涉及到两个命令: setenv 和 saveenv 命令描述setenv用于设置或者修改环境变量的值saveenv用于保存修改后的环境变量 一般环境变量是存放在外部 flash 中的,uboot 启…...
做pc端网站适配/网站运营主要做什么工作
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!1. Kafka整体结构图Kafka名词解释…...
买模板做网站/百度网站大全首页
这问题我会先自我介绍一下,我是十五年工作经验的程序员,但很不好意思,今年(2020年)二月份才接触linux,到现在为止(2020年11月),已经在公司内部的布署了多套linux下的应用与解决方案,并负责这些服务器的运维,我觉得我有资格回答你的问题.以下是我的回答:1.安装linux,不推荐使用虚…...
网站文章怎么做才能被收录/长春seo排名公司
DB : 11.2.0.3.0Oracle DBLINK 创建分为private 和 public dblink,默认创建的为private ; private dblink 只有创建的schema才能删除,sys也删除不了;public dblink 任意schema都可以删除,只要权限够。一、PRIVATE DBLINK:收回dba权限:SQL>…...
为什么不自己做购物网站/赣州seo
2017-08-19 主要内容:CPU和GPU介绍,几种深度学习框架的介绍 1.CPU和GPU CPU一般核数目比较少,适合做通用的计算,速度比较快,共享系统的内存 GPU一般单个核心的速度比较慢,但是核心数目很多,几千…...
网站搭建是哪个岗位做的事儿/福州百度关键词排名
关于先序遍历、中序遍历、后序遍历的定义可以参考这篇博客二叉树的遍历规则。 目前能够百度到的问题大多都是根据(先序&中序)或(中序&后序)序列构建唯一二叉树,其中贴出一些提供思路的博客:二叉树…...