但我有误导性的笔记,博客,关于原子与非原子关于线程安全的答案,请解释一下答案。
假设有一个名为“name”的原子字符串属性,如果从线程A调用[self setname:@“A”],则从线程B调用[self setname:@“B”],并从线程B调用[self name]线程C,则不同线程上的所有 *** 作将被连续执行,这意味着如果一个线程正在执行setter或getter,则其他线程将等待。这使得属性“名称”读/写安全,但如果另一个线程D同时调用[名称释放],则此 *** 作可能会产生崩溃,因为这里没有涉及setter / getter调用。这意味着对象是读/写安全(ATOMIC),但不是线程安全,因为另一个线程可以同时向对象发送任何类型的消息。
如果属性“名称”是非原子的,则上述示例-A,B,C和D中的所有线程将同时执行,产生任何不可预测的结果。在原子的情况下,A,B或C中的任一个将首先执行,但D仍然可以并行执行。
您的评论将帮助我们….
我的问题是,“这是线程安全的可可,原子或非原子?
解决方法 对于ObjC属性 – 两者都不是线程安全。原子更能抵抗线程错误。总的来说,这是一个好奇的默认。你喜欢原子的方案很少。原子可以提高正确性的概率,但是它太低的水平被认为是适当的锁定机制的替代。因此,如果你需要线程安全,你仍然需要一些其他同步原语在原子读/写。如果你不需要线程安全(例如,实例是不可变的或者意图从主线程运行),atomic将不会添加任何东西。
抵抗线程错误不是一个“质量” – 它用于掩盖真正的线程错误,使它们更难以重现和检测。
还要注意,可变对不可变类型实际上不保证线程安全。 “Mutable”可以在ObjC名称中使用,仅指向接口 – 不可变实例的内部实际上可能实际上具有内部可变状态。总之,你不能假设有一个可变子类的类型是线程安全的。
问题展开:
Suppose there is an atomic string property called “name”,and if you call [self setname:@”A”] from thread A,call [self setname:@”B”] from thread B,and call [self name] from thread C,then all operation on different thread will be performed serially which means if one thread is executing setter or getter,then other threads will wait.
如果所有线程同时尝试读取和/或写入属性,则一次只有一个线程将访问,其他线程将被阻止,如果属性是原子的。如果属性是非原子的,那么它们都将在相同的“时间”具有对该变量的无保护的读和写访问。
if another thread D calls [name release] simultaneously then this operation might produce a crash because there is no setter/getter call involved here.
正确。
Which means an object is read/write safe (ATOMIC) but not thread safe as another threads can simultaneously send any type of messages to the object.
嗯,真的有很多。常见的例子是:
@interface MONPerson : NSObject @property (copy) Nsstring * firstname; @property (copy) Nsstring * lastname; - (Nsstring *)fullname; @end
原子或非原子的,如果一个线程正在从该实例读取,另一个线程正在写入该实例,则需要一个同步机制(例如锁定)。你可能会得到一个MONPerson的firstname和另一个lastname – 对象可能已经改变之前getter的返回值甚至返回给你,或者这可能发生:
线程A:
p.firstname = @"Rob";
线程B:
p.firstname = @"Robert";
线程A:
label.string = p.firstname; // << uh,oh -- will be Robert
If the property “name” was nonatomic,then all threads in above example – A,B,C and D will execute simultaneously producing any unpredictable result.
右 – 初始症状可以是参考计数不平衡(泄漏,过度释放)。
In case of atomic,Either one of A,B or C will execute first but D can still execute in parallel. Kindly comment on this….
正确。但是,如果你看看上面的例子 – 原子独自很少是一个合适的替代锁。它应该看起来像这样:
线程A:
[p lock]; // << wait for it… … … …// Thread B Now cannot access pp.firstname = @"Rob";Nsstring fullname = p.fullname;[p unlock];// Thread B can Now access plabel.string = fullname;
线程B:
[p lock]; // << wait for it… … … …// Thread A Now cannot access p…[p unlock];
原子访问器的平均速度比非原子访问的平均速度快20倍。同样,如果你的类需要是线程安全的并且具有可变状态,当它在并发场景中 *** 作时,你可能最终使用锁。适当的锁定提供了您需要的所有保证 – 原子访问器在这种情况下是冗余的,使用原子只会增加cpu时间。关于常规锁的另一个好处是,你有你需要的所有粒度 – 虽然它通常比用于原子的自旋锁更重,你通常需要更少的采集,所以如果你正确使用常规锁,它最终会非常快。
总结以上是内存溢出为你收集整理的objective-c – 这是线程安全的原子还是非原子?全部内容,希望文章能够帮你解决objective-c – 这是线程安全的原子还是非原子?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)