标签: lock-free

了解CLR 2.0内存模型

Joe Duffy给出了描述CLR 2.0+内存模型的6条规则(它是实际的实现,而不是任何ECMA标准)我正在写下我试图解决这个问题的方法,主要是作为橡皮避短的一种方式,但如果我犯了一个错误在我的逻辑中,至少有人能够在它引起我悲伤之前抓住它.

  • 规则1:从不违反加载和存储之间的数据依赖性.
  • 规则2:所有商店都有发布语义,即没有加载或商店可能会在一个商店之后移动.
  • 规则3:获取所有易失性载荷,即没有载荷或储存可能在其之前移动.
  • 规则4:任何加载和存储都不能跨越全屏障(例如Thread.MemoryBarrier,lock acquire,Interlocked.Exchange,Interlocked.CompareExchange等).
  • 规则5:永远不会引入堆的加载和存储.
  • 规则6:只有在从相邻位置合并相邻的装载和存储时,才能删除装载和存储.

我试图理解这些规则.

x = y
y = 0 // Cannot move before the previous line according to Rule 1.

x = y
z = 0
// equates to this sequence of loads and stores before possible re-ordering
load y
store x
load 0
store z
Run Code Online (Sandbox Code Playgroud)

看看这个,看起来负载0可以在加载y之前向上移动,但是存储可能根本不会被重新排序.因此,如果一个线程看到z == 0,那么它也会看到x == y.

如果y是易失性的,那么加载0在加载y之前不能移动,否则它可能会移动.挥发性商店似乎没有任何特殊属性,没有商店可以相互重新订购(这是一个非常有力的保证!)

完全障碍就像沙子中的一条线,装载和存储不能移动.

不知道规则5的含义.

我认为规则6意味着如果你这样做:

x = y
x = z
Run Code Online (Sandbox Code Playgroud)

然后CLR可以删除y的加载和x的第一个存储.

x = y
z = y
// equates …
Run Code Online (Sandbox Code Playgroud)

.net c# memory multithreading lock-free

13
推荐指数
1
解决办法
2575
查看次数

无锁结构的C++原子操作

我正在使用原子(双)比较和交换指令实现无锁机制,例如cmpxchg16b

我目前正在汇编中编写它,然后将其链接进去.但是,我想知道是否有办法让编译器自动为我执行此操作?例如,带有'原子级'的环绕代码块,并让它弄清楚如何将代码实现为底层处理器体系结构中的原子指令(或者如果底层arch不支持它,则在编译时生成错误)?

PS我知道gcc有一些内置函数(至少对于CAS)

http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins

c++ atomic lock-free

12
推荐指数
2
解决办法
2万
查看次数

Delphi是否存在无锁队列"多个生产者 - 单个消费者"?

我发现了单个生产者 - 单个消费者的几个实现,但是没有针对多个生产者 - 单个消费者的实现.

Delphi是否存在"多个生产者 - 单个消费者"的无锁队列?

delphi lock-free data-structures

12
推荐指数
1
解决办法
3924
查看次数

互锁和内存障碍

我有一个关于以下代码示例的问题(m_value不是volatile,每个线程都在一个单独的处理器上运行)

void Foo() // executed by thread #1, BEFORE Bar() is executed
{
   Interlocked.Exchange(ref m_value, 1);
}

bool Bar() // executed by thread #2, AFTER Foo() is executed
{
   return m_value == 1;
}
Run Code Online (Sandbox Code Playgroud)

在Foo()中使用Interlocked.Exchange是否保证在执行Bar()时,我会看到值"1"?(即使值已存在于寄存器或缓存行中?)或者在读取m_value的值之前是否需要设置内存屏障?

另外(与原始问题无关),声明一个volatile成员并通过引用InterlockedXX方法传递它是否合法?(编译器警告通过引用传递volatile,所以在这种情况下我应该忽略警告吗?)

请注意,我不是在寻找"更好的做事方式",所以请不要发布建议完全替代方式("使用锁定"等)的答案,这个问题来自于纯粹的兴趣..

c# c++ parallel-processing multithreading lock-free

12
推荐指数
2
解决办法
3542
查看次数

使用无锁编程深层次的高级抽象不受欢迎的原因是什么?

从我在锁定免费编程上收集到的内容来看,这是非常难以做到的......我同意.只是想一些问题会让我头疼.但我想知道的是,为什么没有广泛使用高级包装器(例如无锁队列和类似的东西)?例如,boost没有锁定免费库,但据我所知,有人建议使用.我的意思是我猜有很多应用程序,你不能避免关键部分是负载的重要部分.那么原因是什么?是吗...

  1. 专利 - 我听说一些与无锁编程相关的东西已获得专利.
  2. 性能.
  3. 谷歌和微软都有像这样的内部库,但没有一个是公开的......
  4. 别的什么?

所以我的问题是:为什么使用无锁编程的高级抽象不是很受欢迎,而同时"常规"多线程编程是"在"?

编辑:boost有一个无锁lib :)

queue boost lock-free concurrent-programming

12
推荐指数
1
解决办法
1160
查看次数

共享内存IPC同步(无锁)

请考虑以下情形:

要求:

  • Intel x64 Server(多个CPU插槽=> NUMA)
  • Ubuntu 12,GCC 4.6
  • 两个进程在(命名)共享内存上共享大量数据
  • 古典生产者 - 消费者情景
  • 内存安排在循环缓冲区(带M个元素)

程序序列(伪代码):

流程A(生产者):

int bufferPos = 0;
while( true )
{
    if( isBufferEmpty( bufferPos ) )
    {
        writeData( bufferPos );
        setBufferFull( bufferPos );

        bufferPos = ( bufferPos + 1 ) % M;
    }
}
Run Code Online (Sandbox Code Playgroud)

流程B(消费者):

int bufferPos = 0;
while( true )
{
    if( isBufferFull( bufferPos ) )
    {
        readData( bufferPos );
        setBufferEmpty( bufferPos );

        bufferPos = ( bufferPos + 1 ) % M;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这个古老的问题:如何有效地同步它们!? …

c++ synchronization ipc shared-memory lock-free

12
推荐指数
1
解决办法
1万
查看次数

为什么商店装载障碍被认为是昂贵的?

大多数CPU架构都会重新订购存储加载操作,但我的问题是为什么?我对商店装载障碍的解释如下:

x = 50;
store_load_barrier;
y = z;
Run Code Online (Sandbox Code Playgroud)

此外,与发布和获取语义相比,我没有看到这种障碍如何在无锁编程中有多大用处.

concurrency multithreading cpu-architecture lock-free

12
推荐指数
1
解决办法
1732
查看次数

如何将std :: string放入boost :: lockfree :: queue(或替代)?

我正在尝试将std::strings放入boost::lockfree::queues中,以便我的线程可以使用新数据相互更新.

当我尝试使用时boost::lockfree::queue<std::string> updated_data;,g++说:

在'class boost :: lockfree :: queue>'的实例化中:

错误:静态断言失败:(boost :: has_trivial_destructor :: value)

错误:静态断言失败:(boost :: has_trivial_assign :: value)

一般都会看到这些错误意味着什么,但我自己也没有希望自己解决这个问题,因为我几乎是c ++的新手.

有没有另一种方法在线程之间传递文本数据lockfree?如果不是,请告诉我如何把std::stringboost::lockfree::queue.

c++ queue boost stdstring lock-free

11
推荐指数
3
解决办法
8912
查看次数

ABA在无锁算法中

我理解ABA问题.但我无法理解的是:他们说在有自动垃圾收集的语言中它可能无法展示.所以我的问题是:

  • 自动垃圾收集如何防止ABA问题的发生?
  • 是否有可能在java中,如果可以,如何?
  • 有可能防止这种情况发生吗?

java concurrency lock-free

11
推荐指数
1
解决办法
2296
查看次数

为什么标准库不以无锁方式为8字节以下的结构实现std :: atomic?

假设该体系结构可以以无锁的方式为std :: atomic支持8字节标量。为什么标准库不为8字节以下的结构提供类似的专业化知识?

这种std :: atomic专门化的简单实现可以std::memcpy将结构序列化/反序列化为等效形式std::uintx_t,其中xstruct的宽度以位为单位(四舍五入为最接近的2的幂,大于或等于2的整数)。结构的宽度)。这将很好地定义,因为std :: atomic要求这些结构是可微复制的。

例如。https://godbolt.org/z/sxSeId,这里Something只有3个字节,但实现调用__atomic_load__atomic_exchange都使用锁表。

c++ atomic lock-free stdatomic c++17

11
推荐指数
1
解决办法
168
查看次数