Questions tagged «atomic»

原子操作是不可分割的。该术语用于描述数据库中的事务,多线程程序中的低级访问以及文件系统操作等。


7
atomic / volatile / synchronized有什么区别?
原子/易失性/同步在内部如何工作? 以下代码块之间有什么区别? 代码1 private int counter; public int getNextUniqueIndex() { return counter++; } 代码2 private AtomicInteger counter; public int getNextUniqueIndex() { return counter.getAndIncrement(); } 代码3 private volatile int counter; public int getNextUniqueIndex() { return counter++; } 是否volatile以以下方式工作?是 volatile int i = 0; void incIBy5() { i += 5; } 相当于 …

6
编程中的“原子”是什么意思?
在有效的Java书中,它指出: 语言规范保证读或写一个变量是原子,除非变量的类型的long或double[JLS,17.4.7]。 在Java编程或一般编程中,“原子”是什么意思?
273 java  atomic 


3
std :: atomic到底是什么?
我明白那个 std::atomic<>是一个原子对象。但是原子到什么程度呢?据我了解,操作可以是原子的。使对象原子化的确切含义是什么?例如,如果有两个线程同时执行以下代码: a = a + 12; 那么整个操作(比如说add_twelve_to(int))是原子的吗?还是对变量atomic进行了更改(so operator=())?

13
num ++是否可以对“ int num”是原子的?
通常,for int num,num++(或++num)作为读取-修改-写入操作不是原子的。但是我经常看到编译器(例如GCC)为此生成以下代码(请尝试在此处): 由于对应的第5行num++是一条指令,在这种情况下,我们可以得出结论num++ 是原子的吗? 如果是这样,是否意味着这样生成的代码num++可以在并发(多线程)场景中使用,而不会造成数据争用的危险(即,例如,我们不需要这样做,std::atomic<int>并且会产生相关的成本,因为它反正还是原子的? 更新 注意,这个问题不是增量是否是原子的(不是,那过去是,现在是问题的开头)。这是在特定情况下是否可以使用,即在某些情况下是否可以利用单指令性质来避免lock前缀的开销。并且,正如公认的答案在有关单处理器机器的部分中提到的那样,以及该答案,其注释中的对话和其他解释都可以(尽管不是使用C或C ++)。

8
!=检查线程安全吗?
我知道诸如之类的复合操作i++不是线程安全的,因为它们涉及多个操作。 但是,检查引用本身是否是线程安全的操作? a != a //is this thread-safe 我尝试对此进行编程,并使用多个线程,但没有失败。我想我无法在机器上模拟种族。 编辑: public class TestThreadSafety { private Object a = new Object(); public static void main(String[] args) { final TestThreadSafety instance = new TestThreadSafety(); Thread testingReferenceThread = new Thread(new Runnable() { @Override public void run() { long countOfIterations = 0L; while(true){ boolean …

5
何时在多线程中使用volatile?
如果有两个线程访问全局变量,那么许多教程都说要使变量可变,以防止编译器将变量缓存在寄存器中,从而导致无法正确更新。但是,两个都访问共享变量的线程需要通过互斥锁进行保护,不是吗?但是在那种情况下,在线程锁定和释放互斥锁之间,代码处于关键部分,其中只有一个线程可以访问该变量,在这种情况下,变量不需要是可变的? 因此,多线程程序中volatile的用途/目的是什么?

6
AtomicInteger lazySet与set
lazySet和的set方法有AtomicInteger什么区别?该文档没有太多关于lazySet: 最终设置为给定值。 似乎存储的值不会立即设置为所需值,而是计划在将来的某个时间设置。但是,这种方法的实际用途是什么?有什么例子吗?
116 java  concurrency  atomic 


4
在UNIX中,文件追加是原子的吗?
通常,当我们从多个进程附加到UNIX中的文件时,我们可以理所当然地做什么呢?是否有可能丢失数据(一个进程覆盖另一个进程的更改)?数据有可能被破坏吗?(例如,每个进程向日志文件中的每个追加追加一行,是否有可能两行被整顿?)如果从上述意义上说,追加不是原子的,那么确保互斥的最佳方法是什么?

3
原子操作成本
原子操作(比较和交换或原子加/减的任何操作)的成本是多少?它消耗多少个周期?它会暂停SMP或NUMA上的其他处理器,还是会阻止内存访问?它将刷新乱序CPU中的重排序缓冲区吗? 缓存会受到什么影响? 我对流行的现代CPU感兴趣:x86,x86_64,PowerPC,SPARC,Itanium。

5
了解C ++ 11中的std :: atomic :: compare_exchange_weak()
bool compare_exchange_weak (T& expected, T val, ..); compare_exchange_weak()是C ++ 11中提供的比较交换原语之一。即使对象的值等于,它也返回false,这是弱的expected。这是由于在某些平台上使用了一系列指令(而不是x86上的指令)来实现它的虚假故障所致。在这样的平台上,上下文切换,另一个线程重新加载相同的地址(或缓存行)等可能会使原语失败。这是spurious因为它不是所述对象(不等于的值expected失败的操作)。相反,这是一种时间问题。 但令我感到困惑的是C ++ 11标准(ISO / IEC 14882)中所说的内容, 29.6.5 ..伪失败的后果是几乎所有弱比较和交换的使用都将循环。 为什么几乎在所有用途中它都必须处于循环状态?这是否意味着我们会在由于虚假故障而失败时循环?如果是这样,为什么我们还要compare_exchange_weak()自己动手使用和编写循环?我们可以使用compare_exchange_strong()我认为应该为我们消除虚假故障的方法。常见的用例是compare_exchange_weak()什么? 另一个问题有关。安东尼在他的《行动中的C ++并发性》一书中说: //Because compare_exchange_weak() can fail spuriously, it must typically //be used in a loop: bool expected=false; extern atomic<bool> b; // set somewhere else while(!b.compare_exchange_weak(expected,true) && !expected); //In this case, you …



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.