objective-c – 这是线程安全的原子还是非原子?

objective-c – 这是线程安全的原子还是非原子?,第1张

概述我搜索并发现不可变是线程安全,而mutable不是。这可以。 但我有误导性的笔记,博客,关于原子与非原子关于线程安全的答案,请解释一下答案。 假设有一个名为“name”的原子字符串属性,如果从线程A调用[self setName:@“A”],则从线程B调用[self setName:@“B”],并从线程B调用[self name]线程C,则不同线程上的所有 *** 作将被连续执行,这意味着如果一个线程正在 我搜索并发现不可变是线程安全,而mutable不是。这可以。
但我有误导性的笔记,博客,关于原子与非原子关于线程安全的答案,请解释一下答案。

假设有一个名为“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 – 这是线程安全的原子还是非原子?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1042643.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存