网站首页 > 博客文章 正文
前言
原子操作和临界区/互斥体对比更轻量级,不过并不能代替临界区/互斥体,只能用于数值操作(加减/交换/赋值).原子操作是不可分割的.先看一下下面的代码.
//c语言代码
void add() {
int i =1;
i+=2;
}
看一下生成汇编代码:
add:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 1 // int i =1;
add DWORD PTR [rbp-4], 2 // i+=2;
nop
pop rbp
ret
我们看到 i+=2 生成汇编指令,要先读取寄存器的值,然后和2进行加法运算.在多线程中就会出现一个线程读取寄存器的值,另外一个线程已经进行加法运算,这样造成最终值不是我们预期的值.
原子操作
#include <Windows.h>
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#define THREADCOUNT 4 //线程数量
int num = 0;
DWORD WINAPI func(void *p)
{
for (int i = 0; i < 10000; i++)
{
InterlockedIncrement(&num); //InterlockedIncrement让num++成为原子操作
//InterlockedExchangeAdd(&num, 1); //效果和InterlockedIncrement一样
}
return 0;
}
int main(int argc, char *argv[])
{
HANDLE hd[THREADCOUNT];
for (int i = 0; i < THREADCOUNT; i++)
{
hd[i] = CreateThread(NULL, 0, func, NULL, 0, NULL);
}
WaitForMultipleObjects(THREADCOUNT, hd, TRUE, INFINITE);
printf("num=%d\n", num);
system("pause");
return 0;
}
原子操作的速度要快于临界区和互斥体.
原子操作是如何实现的
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
int main(int argc, char* argv[])
{
int i = 1;
InterlockedIncrement(&i); //反汇编,看一下
return 0;
}
Windows上的原子操作,是使用CPU指令,所以锁定地址,该操作未完成之前,不让其他线程进行操作.
个人能力有限,如果您发现有什么不对,请私信我
如果您觉得对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技术交流
猜你喜欢
- 2024-09-26 “全栈2019”Java原子操作第十一章:CAS与ABA问题介绍及解决方案
- 2024-09-26 【Go语言】Golang中原子操作用法(go 原子操作)
- 2024-09-26 从CAS讲起,真正高性能解决并发编程的原子操作
- 2024-09-26 “全栈2019”Java原子操作第九章:atomic包下原子数组介绍与使用
- 2024-09-26 “全栈2019”Java原子操作第九章:atomic包下原子数组简单介绍
- 2024-09-26 “全栈2019”Java原子操作第十一章:CAS与ABA问题介绍与探讨
- 2024-09-26 CAS原子操作实现无锁及性能分析(cas能保证原子性吗)
- 2024-09-26 面试必备:Java 原子操作的实现原理「精品长文」
- 2024-09-26 java的原子操作和原子操作的好处(java原子类的使用场景)
- 2024-09-26 原子操作&普通锁&读写锁原理讲解
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)