博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原子访问
阅读量:5330 次
发布时间:2019-06-14

本文共 760 字,大约阅读时间需要 2 分钟。

线程同步一大部分与原子访问(atomic access)有关, 所谓原子访问, 指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源.

假设编译器将g_x递增的那行代码时,生成了下面的汇编代码:
MOV EAX, [g_x] ;   Move the value in g_x into a register
INC EAX        ;   Increment the value in the register
MOV [g_x] , EAX;   Store the new value back in g_x
 
两个线程不太可能在完全相同的时刻执行上面的代码. 但如果是下面这样呢?
MOV EAX, [g_x]  ;  thread1: move 0 into a register
INC EAX         ;  thread1: Increment the register to 1
 
MOV EAX, [g_x]  ;  thread2: Move 0 into a register
INC EAX         ;  thread2: Increment the register to 1
MOV [g_x], EAX  ;  thread2: Store 1 back in g_x
 
MOV [g_x] , EAX ; thread 1 : Store 1 back in g_x.
 
结果显而易见,这是不正确的,多个线程访问同一资源的方式.
为了解决这个问题,需要一种方法能够保证对一个值的递增操作是原子操作---就是说,不会被打断,Interlocked系列函数为我们提供了这种解决方案,所有这些函数会以原子方式操作一个值.
 

转载于:https://www.cnblogs.com/xiejiulong/p/3924739.html

你可能感兴趣的文章
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
各种正则验证
查看>>
观察者模式(Observer)
查看>>
python中numpy.r_和numpy.c_
查看>>
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
freebsd 实现 tab 命令 补全 命令 提示
查看>>
struts1和struts2的区别
查看>>
函数之匿名函数
查看>>
shell习题第16题:查用户
查看>>
Redis常用命令
查看>>
2018.11.06 bzoj1040: [ZJOI2008]骑士(树形dp)
查看>>
2019.02.15 bzoj5210: 最大连通子块和(链分治+ddp)
查看>>
redis cluster 集群资料
查看>>
微软职位内部推荐-Sr. SE - Office incubation
查看>>
微软职位内部推荐-SOFTWARE ENGINEER II
查看>>
centos系统python2.7更新到3.5
查看>>
C#类与结构体究竟谁快——各种函数调用模式速度评测
查看>>