问题标签 [nonatomic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
483 浏览

c++ - 在 C++11 和 OpenMP 中对非原子内存位置的原子访问?

与 C++11 相比,OpenMP 从内存操作的角度而不是变量的角度使用原子性。例如,这允许对在编译时存储在大小未知的向量中的整数使用原子读/写:

在 C++11 中,这是不可能实现的。我们可以通过放松内存模型将原子变量作为非原子变量来访问,但我们不能调整原子元素向量的大小。

我知道 C++ 不允许通过原子内存操作访问非原子变量是有原因的。但我想知道,为什么这些原因也不适用于 OpenMP。

例如,在N4013中,据说“没有合理的方法可以将原子操作完全可移植地应用于未声明为原子的数据。” OpenMP 怎么可能保证这样的可移植性而 C++ 不能?

0 投票
5 回答
5873 浏览

multithreading - 原子操作会阻塞其他线程吗?

我试图让“原子与非原子”的概念在我脑海中浮现。我的第一个问题是我找不到“现实生活中的类比”。就像客户/餐厅关系通过原子操作或类似的东西。

另外我想了解原子操作如何将自己置于线程安全编程中。

在这篇博文中;http://preshing.com/20130618/atomic-vs-non-atomic-operations/ 它被称为:

一个作用于共享内存的操作是原子的,如果它相对于其他线程在一个步骤中完成。当对共享变量执行原子存储时,没有其他线程可以观察到修改 half-complete。当对共享变量执行原子加载时,它会读取在某个时刻出现的整个值。非原子加载和存储不做这些保证。

“没有其他线程可以观察到修改半完成”是什么意思?

这意味着线程将等到原子操作完成?该线程如何知道该操作是原子的?例如,在 .NET 中,我可以理解如果您锁定对象,则设置标志以阻止其他线程。但是原子呢?其他线程如何知道原子操作和非原子操作之间的区别?

此外,如果上述陈述为真,那么所有原子操作都是线程安全的吗?

0 投票
1 回答
2005 浏览

objective-c - 为什么原子和非原子概念已从 swift 中删除

swift 中没有 nonatomic 关键字,为什么 swift 中不需要 nonatomic,因为它存在于目标 c 中。

0 投票
0 回答
72 浏览

c - C - 持有锁时的 volatile 限定符

对于仅在持有锁时访问的变量,我是否需要 volatile 限定符?n在此代码中,可以从可能更改concurrent_foo并发执行时的行为中删除 volatile 限定符。

我知道 volatile 限定符指示编译器不要优化对变量的内存访问。我也知道 __sync_lock 内置函数发出一个(完整的?)内存屏障,内存访问不应该跨越。但是,在此示例代码中,可以安全地获取n,将其缓存在寄存器中,计算新值,然后将其写回n.

使用 GCC 编译到 i686 源代码,-O3发现两次内存提取是不必要的:

如果没有 volatile 限定符,我会得到微妙不同的代码,其中n仅获取一次:

在这两种情况下,内存访问n都会在持有锁时发生,因此应该是“正确的”。但是,我不确定我是否真的能保证这一点。volatile 限定符阻止了我想要的性能优化,并且不会影响操作的结果(在任何时候都不会n是偶数)。

0 投票
1 回答
61 浏览

r - 如何从R中的列表中删除函数?

我有两个功能的列表:

如何在不知道其索引的情况下删除函数 foo?

我试过这个(获取子设置的索引):

有没有简单的方法从列表中删除非原子而不循环?