财产申报中的含义atomic和nonatomic含义是什么?
@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;
Run Code Online (Sandbox Code Playgroud)
这三者之间的运作区别是什么?
在Objective-C中为基本类型指定属性是否有意义nonatomic?
我想知道这两个属性之间的区别:
@property (nonatomic) BOOL myBool;
@property BOOL myBool;
Run Code Online (Sandbox Code Playgroud) 一位朋友告诉我,标量属性的@property默认值(BOOL,NSInteger等)是非原子的.也就是说,
@property BOOL followVenmo;
Run Code Online (Sandbox Code Playgroud)
默认为
@property (nonatomic) BOOL followVenmo;
Run Code Online (Sandbox Code Playgroud)
但是,我总是认为默认值始终是原子,标量或不是.
这是什么?
与C++ 11相比,OpenMP从内存操作的角度来看是原子性的,而不是变量.这允许例如对在编译时存储在具有未知大小的向量中的整数使用原子读/写:
std::vector<int> v;
// non-atomic access (e.g., in a sequential region):
v.resize(n);
...
v.push_back(i);
...
// atomic access in a multi-threaded region:
#pragma omp atomic write // seq_cst
v[k] = ...;
#pragma omp atomic read // seq_cst
... = v[k];
Run Code Online (Sandbox Code Playgroud)
在C++ 11中,这是不可能实现的.我们可以通过放松内存模型来将原子变量作为非原子变量进行访问,但是我们无法调整原子元素的向量.
我理解为什么C++不允许通过原子内存操作访问非原子变量.但我想知道,为什么这些原因也不适用于OpenMP.
例如,在N4013中,据说"没有合理的方法将原子操作完全可移植地应用于未声明为原子的数据." OpenMP如何能够保证这种可移植性和C++不是这样?
以下Objective-c 2.0代码段之间有何不同(如果有):
// in MyClass.h
@interface MyClass
@private
NSString *myString;
@end
Run Code Online (Sandbox Code Playgroud)
和
// in MyClass.m
@interface MyClass ()
@property (nonatomic, copy) NSString *myString;
@end
@implementation MyClass
@synthesize myString;
@end
Run Code Online (Sandbox Code Playgroud) 我有两个功能的清单:
foo <- function() { print('foo') }
bar <- function() {}
l <- list(foo, bar)
Run Code Online (Sandbox Code Playgroud)
如何在不知道其索引的情况下删除函数foo?
我已经尝试过此操作(以获取子设置的索引):
> which(l == foo)
Error in l == foo :
comparison (1) is possible only for atomic and list types
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法可以从列表中删除非原子而不循环?
我试图让"原子与非原子"概念在我的脑海中解决.我的第一个问题是我找不到"现实生活中的类比".就像原子操作上的客户/餐馆关系或类似的东西.
另外,我想了解原子操作如何将自己置于线程安全编程中.
在这篇博文中; http://preshing.com/20130618/atomic-vs-non-atomic-operations/ 它被提及为:
如果相对于其他线程在一个步骤中完成,则对共享内存执行的操作是原子操作.当对共享变量执行原子存储时,没有其他线程可以观察到修改半完成.当对共享变量执行原子加载时,它会读取单个时刻出现的整个值.非原子载荷和商店不做出这些保证.
"没有其他线程可以观察修改半完成"是什么意思?
这意味着线程将等待直到原子操作完成?该线程如何知道该操作是原子的?例如在.NET中我可以理解,如果你锁定对象,你设置一个标志来阻止其他线程.但原子怎么样?其他线程如何知道原子操作和非原子操作之间的区别?
如果上面的语句为真,那么所有原子操作都是线程安全的吗?
swift 中没有 nonatomic 关键字,为什么 swift 中不需要 nonatomic,因为它存在于 Objective c 中。
我已经阅读了一些类似的问题,但那里描述的情况有点复杂.
我在堆中有一个bool b初始化false和两个线程.我确实理解操作bools是not atomic,但请直到最后阅读问题.
第一个线程只能设置b = true一次,不会对它做任何其他事情.第二个线程检查b一个循环,如果它true做了一些动作.
我是否需要使用某些同步机制(如互斥锁)来保护b?如果我不这样做会怎么样?随着ints我能明显得到任意值,当我读到,并在同一时间写.但是,bools只有true而且false我不介意一次得到false而不是true.这是一种潜力SIGSEGV吗?
nonatomic ×9
atomic ×5
objective-c ×5
properties ×4
c++ ×2
concurrency ×1
default ×1
ios ×1
list ×1
openmp ×1
r ×1
swift ×1
swift3 ×1