32得票3回答
std::mutex创建障栅吗?

如果我锁定一个std::mutex,我是否总是会得到内存屏障?我不确定它是暗示还是强制你获得屏障。 更新: 在RMF的评论后发现了这个参考资料。 多线程编程和内存可见性

31得票3回答
内存栅栏:获取/加载和释放/存储

我对 std::memory_order_acquire 和 std::memory_order_release 的理解如下:Acquire 的意思是,在 acquire fence 之后的内存访问不能被重排序到 fence 之前。Release 的意思是,在 release fence 之前...

31得票4回答
内存屏障是否确保缓存一致性已完成?

说我有两个线程在操作全局变量 x。每个线程(或者每个核心)都会拥有 x 的缓存副本。 现在假设 线程A 执行以下指令:set x to 5 some other instruction 现在当执行set x to 5时,x的缓存值将被设置为5,这将导致缓存一致性协议起作用,并使用x的新值更新...

30得票5回答
在x86架构中,哪种写屏障更好:lock+addl还是xchgl?

Linux内核使用lock; addl $0,0(%%esp)作为写障碍,而RE2库使用xchgl (%0),%0作为写障碍。它们有什么区别,哪一个更好? x86是否也需要读屏障指令? 在x86上,RE2将其读屏障函数定义为无操作,而Linux将其定义为lfence或无操作,具体取决于SSE...

30得票4回答
线程安全的类在构造函数末尾应该有内存屏障吗?

当实现一个旨在保证线程安全的类时,我应该在其构造函数的末尾包含一个内存屏障,以确保任何内部结构在被访问之前已经完成初始化吗?还是消费者有责任在将实例提供给其他线程之前插入内存屏障?简化问题:下面的代码是否存在竞争风险,由于初始化和访问线程安全类之间缺少内存屏障而导致错误行为?或者线程安全类本身...

29得票4回答
使用4个线程的获取/释放语义

我目前正在阅读安东尼·威廉姆斯的《C++ Concurrency in Action》。他的其中一段代码如下,并指出断言z != 0可能会触发。 #include <atomic> #include <thread> #include <assert.h>...

29得票2回答
C++原子操作的内存屏障

我对此很陌生。是否有人能够提供以下内存屏障之间差异的简化解释? Windows的MemoryBarrier(); fence的_mm_mfence(); 内联汇编asm volatile("": : :"memory"); 内部函数_ReadWriteBarrier(); 如果没有简单...

29得票2回答
内存模型中的排序和可见性?

我试图查找有关此内容的详细信息,甚至阅读了有关互斥锁和原子的标准...但仍然无法理解C++11内存模型可见性保证。 据我所知,互斥锁除了实现互斥访问之外,最重要的功能是确保可见性。即每次只有一个线程增加计数器是不够的,重要的是该线程增加由上一个使用互斥锁的线程存储的计数器(当讨论互斥锁时,人们...

28得票3回答
内存屏障生成器

阅读Joseph Albahari的线程教程,以下是被提及为内存屏障生成器的内容: C#的lock语句(Monitor.Enter/Monitor.Exit) Interlocked类中的所有方法 使用线程池的异步回调 - 这些包括异步委托、APM回调和Task延续 设置和等待信号构造 任...

27得票2回答
为什么ThreadSanitizer报告这个无锁示例存在竞态条件?

我将其简化为一个简单的自包含示例。主线程排队1000个项目,工作线程尝试并发出队。即使有一个获取-释放内存屏障序列保护它们,ThreadSanitizer也会抱怨其中一个元素的读取和写入之间存在竞争。#include <atomic> #include <thread>...