众所周知,std::atomic和volatile是两个不同的东西。
主要有两点不同:
两个优化可以用于std::atomic<int> a;,但不能用于volatile int a;
- fused operations: `a = 1; a = 2;` can be replaced by the compiler on `a = 2;`
- constant propagation: `a = 1; local = a;` can be replaced by the compiler on`a = 1; local = 1;`
跨原子/易失性操作的普通读/写的重新排序:
我有以下类:
public class SeqGenerator {
int last = 0;
volatile int lastVolatile = 0;
public int getNext() {
return last++;
}
public synchronized int getNextSync() {
return last++;
}
public int getNextVolatile() {
return lastVolatile++;
}
pu
我有一条线
write a = 0
write a = 1
write volatile flag = 1
在第二条线上
read volatile flag // This always happens after I write volatile flag in thread 1
read a
是否可以进行重新排序,以便在第二个线程中看到read a返回0?
如果没有,能请人详细解释原因吗?
我之所以问这个问题,是因为我对JLS的定义感到困惑:
在每个线程t执行的所有线程间操作中,t的程序顺序是一个总顺序,它反映了根据t的线程内语义执行这些操作的顺序。
在这种情况下,似乎允许重新排
面试官问我,如果我们确信线程永远不会干扰,那么不使用volatile是否有危险。
例如:我们有:
int i = 10;
// Thread 1
i++;
// await some time and switch to Thread 2
getI();
我不使用任何同步。
通过第二个线程接收过时的i值有什么危险吗?
在和的上下文中,以前问过问题,也考虑过,我想知道在下面的c#代码中,对本地捕获变量的访问是否必须是同步的。
// Let’s say we have two classes Person and Animal that are immutable.
// Then there is some code that instantiates and uses instances of these classes:
public void SomeMethod()
{
Person person = null;
Animal animal = null;
Parall