11得票3回答
易失性变量能保证可变对象的安全发布吗?

阅读《Java并发编程实战》之后,我了解到: 要安全地发布一个对象,必须同时使其他线程看到对该对象的引用和状态。可以通过以下方法安全地构造对象: 从静态初始化器中初始化对象引用 将引用存储到volatile类型的字段或AtomicReference中 将引用存储到经过正确构造的对象的fi...

33得票2回答
std::atomic应该加上volatile关键字吗?

我正在运行一个线程,直到设置了一个标志为止。std::atomic<bool> stop(false); void f() { while(!stop.load(std::memory_order_{relaxed,acquire})) { do_the_job();...

10得票3回答
内存映射文件和指向易失对象的指针

我对C和C++中volatile的语义理解是,它将内存访问转换为(observable)副作用。每当读取或写入内存映射文件(或共享内存)时,我希望指针被标记为volatile限定符,以表明这实际上是I/O操作。(John Regehr在volatile的语义方面写了一篇非常好的文章)。 此外...

67得票6回答
Java中的volatile int是线程安全的吗?

在Java中,一个易失性的int是否是线程安全的?也就是说,它可以在没有锁定的情况下被安全地读取和写入吗?

11得票7回答
我能否避免使用锁来处理很少更改的变量?

我一直在阅读Joe Duffy关于并发编程的书。我有一个关于无锁线程的学术问题。 首先:我知道无锁线程充满了危险(如果你不相信我,那就读读书中关于内存模型的部分)。 不过,我有一个问题:假设我有一个类上面有一个整型属性。这个属性引用的值将被多个线程频繁地读取。 很少情况下这个值会改变,而...

12得票1回答
C和C++编译器中具有“激进”易失性语义的特点。

有没有C或C++编译器实现了“激进”的内存一致性模型,适用于volatile变量?所谓的“激进”一致性模型是指在生成的代码中伴随所有对volatile变量的写入操作都会附带内存屏障。 据我所知,在IA64(Itanium)平台上,这是C或C++编译器的惯常行为。那么在x86平台上呢?是否有一...

8得票3回答
为什么只读和易失性修饰符是互斥的?

我有一个引用类型的变量,它是只读的,因为引用从不改变,只有它的属性会改变。当我尝试给它添加volatile修饰符时,编译器警告我不能让两个修饰符应用于同一个变量。但我认为我需要它是volatile的,因为我不想在读取其属性时出现缓存问题。我错过了什么吗?还是编译器错了? 更新:如Martin...

27得票2回答
为什么从volatile类型中没有提供默认的复制构造函数?

这段代码:class X { int member; }; volatile X a; X b = a; 出现错误,错误信息为:prog.cpp:6:7: error: no matching function for call to ‘X::X(volatile X&)’ ...

18得票4回答
C#中的volatile数组项?

我需要一个包含易失性元素的数组,但是找不到实现的方法。 private volatile T[] _arr; 这意味着_arr引用是易变的,但它并不能保证_arr对象内部的任何项目。 有没有办法将_arr的项目标记为易变? 谢谢。 编辑: 根据binarycoder的答案构建了以...

12得票2回答
Java和C#中volatile语义背后的原理是什么?

C# 和 Java 都定义了以下规则: * volatile 读取具有获取语义 * volatile 写入具有释放语义 我的问题是: 这是唯一正确的定义 volatile 的方式吗? 如果不是,如果语义被颠倒,会有很大的区别吗?即 volatile 读取具有释...