我可以使以下代码锁定为空白/原子吗?
int val = memLoc[index++];
我可以使以下代码锁定为空白/原子吗?
或更好,但
int val = memLoc[index++ & 0xFF];
试图做从那里每次调用获取下一个值共享的环形缓冲区读取线程 - 我很想它是无锁,如果在所有可能的,因为它发生在TON。不允许Boost/C++ 11 :(
这里需要同步的唯一操作是index
值的增量。由于这只是一个数值,因此可以不通过原子增量使用锁定。你列出的操作的剩下的只是读取的共享位置,并不需要同步。
在Win32制作同步与InterlockedIncrement
功能所做的增量
int oldValue = InterlockedIncrement(&index);
int val = memLoc[oldValue & 0xFF];
有各种花样增量功能在Linux上可用关于你需要增加在原子操作读回指数在此计算器线程的选项
在C++ 11中,有'std :: atomic_fetch_add'应该可以做到这一点。 – 2012-04-13 14:57:01
有没有写'int'的任何体系结构都不是原子的(你必须同步读取的元素)? – 2012-04-13 15:16:58
@MarkB问题不仅仅是元素的原子写入,它是原子写入+读取旧值+确保它在所有处理器中都可见。通常你需要一个特别的指导。看着我的回答,我在几个地方误用了原子。去清理那个。 – JaredPar 2012-04-13 15:19:29
d讨论。不幸的是,++运算符不保证任何原子性。
大多数处理器都有某种可以使用的提取 - 增量 - 存储指令。您可以插入内联程序集来执行此操作。 http://en.wikipedia.org/wiki/Fetch-and-add
如果你在Windows上运行,微软提供了一个API来访问此:http://msdn.microsoft.com/en-us/library/windows/desktop/ms684122(v=vs.85).aspx
如果你在其他操作系统,有可能类似的功能。不过,无论如何,您需要操作系统或更低级别的访问才能获得原子访存 - 增量存储。
您可能有兴趣阅读[本文](http://www.codeproject.com/Articles/43510/Lock-Free-Single-Producer-Single-Consumer-Circular)。 – 2012-04-13 14:36:55
没有C++ 11意味着你需要一个预标准的解决方案。如果Boost是不可接受的,那么所有其他图书馆(拥有更严格的许可条款)也可能出来,所以你不能得到任何便携。那么,你需要这个操作系统? – MSalters 2012-04-13 15:15:15
什么类型是'memLoc'?它是一个指向(int)的指针(或数组)吗? – 2012-04-13 15:20:43