Interlocked Variable Access

原创 2015年07月09日 10:56:46

Applications must synchronize access to variables that are shared by multiple threads.
Applications must also ensure that operations on these variables are performed atomically (performed in their entirety or not at all.)
应用程序必须同步访问被多个线程共享的变量.应用程序必须确保在共享变量的操作是原子性.要么全部执行,要么完全不执行.


Simple reads and writes to properly-aligned 32-bit variables are atomic operations
In other words, you will not end up with only one portion of the variable updated;
all bits are updated in an atomic fashion.
However, access is not guaranteed to be synchronized.
If two threads are reading and writing from the same variable, you cannot determine if one thread will perform its read operation before the other performs its write operation.
对于内存对齐的32bit变量操作的读和写是原子性的.换言之,对于32bit变量的操作不会只更新一部分.所有位都说原子性更新.
但是,这并不能确保同步的访问.如果两个线程同时对变量读写操作,那么就不能决定一个读操作是在写操作完成后进行的.

Simple reads and writes to properly aligned 64-bit variables are atomic on 64-bit Windows.
Reads and writes to 64-bit values are not guaranteed to be atomic on 32-bit Windows.
Reads and writes to variables of other sizes are not guaranteed to be atomic on any platform.
在64位window操作系统上面读写64位变量是原子性操作.但是在32位windows操作系统上面读写64位变量,则不确保操作是原子性的.
在任何平台上面,读写其他长度的变量的操作都不一定是原子性的.
 
The Interlocked API
The interlocked functions provide a simple mechanism for synchronizing access to a variable that is shared by multiple threads.
They also perform operations on variables in an atomic manner.
The threads of different processes can use these functions if the variable is in shared memory.
原子锁函是多个线程同步访问共享变量的一种简单机制.
The InterlockedIncrement and InterlockedDecrement functions combine the steps involved in incrementing or decrementing a variable into an atomic operation.

This feature is useful in a multitasking operating system, in which the system can interrupt one thread execution to grant a slice of processor time to another thread.
Without such synchronization, two threads could read the same value, increment it by 1, and store the new value for a total increase of 1 instead of 2.
The interlocked variable-access functions protect against this kind of error.

原子锁在多任务操作系统中非常有价值.系统可以一个线程在执行期间不会被另外一个线程打断.
如果不同步情况下,如果两个线程同时读取一个变量,并把该变量加1.结果将是有可能是增加1 而不是增加2. 原子锁将确保变量的访问不会发生这种错误.

Most of the interlocked functions provide full memory barriers on all Windows platforms.
There are also functions that combine the basic interlocked variable access operations with the acquire and release memory ordering semantics supported by certain processors.
Each of these functions contains the word "Acquire" or "Release" in their names;
for example, InterlockedDecrementAcquire and InterlockedDecrementRelease.
Acquire memory semantics specify that the memory operation being performed by the current thread will be visible before any other memory operations are attempted.
Release memory semantics specify that the memory operation being performed by the current thread will be visible after all other memory operations have been completed.
These semantics allow you to force memory operations to be performed in a specific order. Use acquire semantics when entering a protected region and release semantics when leaving it.

Acquire Memory Semantics 当内存正在被当前线程操作时,其他内存操作在尝试时,内存是可见性的.
Release memory semantics 当内存正在被当前线程操作时,只有当前线程内存操作完成时,内存才是可见的.

C#使用Interlocked进行原子操作

什么是原子操作? 原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在C#中有多个线程同时对某个变量进行...
  • OnlyRu
  • OnlyRu
  • 2017年11月14日 14:10
  • 70

读书笔记——Windows核心编程(8)Interlocked系列函数

先让我们来复习下小学知识 A+B=C//式中A为被加数,B为加数。 A-B=C//式中A为被减数,B为减数。 再让我们来明确一个知识点:返回值为void的Windows函数意味着一定会执行成功。...
  • wlsgzl
  • wlsgzl
  • 2013年11月29日 10:59
  • 1908

关于变量的定义

先截取一段道长的 变量的作用域  通常情况下,每个变量默认都是局部变量。 一个case里的变量,作用域在这个case内部; 一个userkeyword里的变量,作用域在这个userkeyw...
  • zhouxuan623
  • zhouxuan623
  • 2014年04月23日 15:57
  • 1109

如何看待才C/C++语言中的变量Variable

如何看待C/C++语言中的变量呢? 原文地址http://denniskubes.com/2013/04/23/how-to-think-about-variables-in-c/ 在C语言中常常被...
  • kangxidashen
  • kangxidashen
  • 2014年03月17日 21:37
  • 1220

apue学习第十一天(2)——深度剖析auto, register, static, extern

好啦,我们接着上一节继续,上节说到了bss vs data,那我们就从变量开始说起。首先,有几个问题: 你知道automatic variable 和 static variable的区别吗?你知道...
  • BlitzSkies
  • BlitzSkies
  • 2015年01月07日 20:24
  • 725

引用作为函数返回值

其次,不能返回函数内部动态分配的内存的引用。虽然不存在局部变量的被动销毁的问题,但是在此种情况下,仍然存在一些问题。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个...
  • lanyang123456
  • lanyang123456
  • 2014年11月06日 19:30
  • 2170

读书笔记——Windows核心编程(8)Interlocked单向链式栈

SLists使用了无锁算法来保证原子同步,以提升系统性能,避免了诸如优先级挂和互锁的问题。 注意:所有的链表项必须对齐到MEMORY_ALLOCATION_ALIGNMENT。否则会出现奇葩的错误。...
  • wlsgzl
  • wlsgzl
  • 2013年11月29日 12:09
  • 2436

Tensorflow实战学习(六)【Variable对象、名称作用域】

Tensor、Op对象不可变(immutable)。.Variable()构造方法创建Variable对象,包含Session.run()调用中可持久化的可变张量值。Variable对象初值通常为全0...
  • WuLex
  • WuLex
  • 2017年11月19日 22:04
  • 151

能够提高开发效率的Eclipse实用操作

工欲善其事,必先利其器。对于程序员来说,Eclipse便是其中的一个“器”。本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍。Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分...
  • linsongbin1
  • linsongbin1
  • 2015年10月07日 21:34
  • 13236

SpringMVC学习笔记(2):请求映射

在前面说过整个SpringMVC都是建立在DispatchServlet上的,通过这个servlet调度各种请求来完成映射的,...
  • lmy86263
  • lmy86263
  • 2016年05月28日 20:18
  • 1313
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Interlocked Variable Access
举报原因:
原因补充:

(最多只允许输入30个字)