在linux内核的内存屏障文档( documentation / memory -barriers.txt)中,有一些例子表明,在内存屏障之后的写入器在写到其他CPU之前是可见的。怎么会发生这种事?为什么写障碍不足以对这些写进行排序?
特别是以下几点:
843 CPU 1 CPU 2
844 ======================= =======================
845 { B = 7; X = 9; Y = 8; C = &Y }
846 STO
我正在尝试学习有关低级并发的基础知识。
来自Linux文档:
A write memory barrier gives a guarantee that all the STORE operations
specified before the barrier will appear to happen before all the STORE
operations specified after the barrier with respect to the other
components of the system.
我认为“所有的存储操作”肯定意味着特定屏障类型的实例比一个屏障
我正在阅读这篇的文章,文章中写道:
事实上,大多数函数调用都充当编译器屏障,无论它们包含自己的编译器屏障还是not.This都排除了内联函数、使用纯属性声明的函数以及使用链接时代码生成的情况。除了这些情况之外,对外部函数的调用甚至比编译器屏障更强,因为编译器不知道该函数的副作用是什么。
这是真实的说法吗?想想这个样本-
std::atomic_bool flag = false;
int value = 0;
void th1 () { // running in thread 1
value = 1;
// use atomic & release to preve
有一篇文章at:描述了Linux循环缓冲区实现。我有一些问题:
以下是“制作人”:
spin_lock(&producer_lock);
unsigned long head = buffer->head;
unsigned long tail = ACCESS_ONCE(buffer->tail);
if (CIRC_SPACE(head, tail, buffer->size) >= 1) {
/* insert one item into the buffer */
struct item *item = buffer[head];
我遇到了一种罕见的但反复发生的种族状况。该程序有两个线程,并使用std::原子。我将简化代码的关键部分,如下所示:
std::atomic<uint64_t> b; // flag, initialized to 0
uint64_t data[100]; // shared data, initialized to 0
线程1(发布):
// set various shared variables here, for example
data[5] = 10;
uint64_t a = b.exchange(1); // signal to thread 2 that
根据Linux内核中的,
all users of atomic_t should treat atomic_read() and atomic_set() as simple
C statements that may be reordered or optimized away entirely by the compiler
or processor, and explicitly invoke the appropriate compiler and/or memory
barrier for each use case. Failure to do so will result i
我理解为什么需要内存屏障,但在单处理器的情况下我就不明白了。
即使用完了,我也要处理障碍吗?每个文档都用SMP来解释它们,但不是UP。
在下面的代码中,有没有可能点a中的r2 == 0?
// the location 0xdeadbeef has a zero initial value
ldr r0, =0xdeadbeef
ldr r1, =0xdeadbeef
ldr r2, =1
str r2, [r0]
ldr r2, [r1]
// point a
假设我有一个由100个字节组成的结构。关于下面的代码,我有什么保证?
m_myLargeStruct = someValue; // copying 100 bytes
Thread.MemoryBarrier();
// Executed by another thread, after "Thread.MemoryBarrier" was called by the first thread
Console.WriteLine(m_myLargeStruct.ToString());
内存模型是否保证100字节副本将在内存屏障放置后完成?还是内存屏障只适用于处理器架构大小
所以我在为一堂课做一个程序。这个项目的目标是让少数人吃一个袋子里的水果。果实给人能量,人的能量每秒钟都在减少。我遇到的问题是,每次吃水果,我都要做一个输出,如下所示:
System.out.println("There are now " + fruitList.size() + " fruits left in the bag.");
据我所知,这应该输出我的数组的当前大小。我感到困惑的是,如果两个人(通过两个不同的线程初始化)在同一时间进食,这应该首先显示“袋子里还剩下10个水果”,然后“袋子里还剩下9个水果”。问题是,这两条信息都会显示出还剩下10种水果。
通过锁帮助器,我指的是可以通过using语句实现锁定的一次性对象。例如,考虑SyncLock类在中的典型用法
public class Example
{
private readonly SyncLock _padlock;
public Example()
{
_padlock = new SyncLock();
}
public void ConcurrentMethod()
{
using (_padlock.Lock())
{
// Now own the pa