How*_*ard 24 multithreading properties atomic objective-c ios
我理解的意思atomic是在原子和非原子属性之间有什么区别?,但我想知道的是:
问:除了性能问题之外,在所有地方使用原子属性是否有任何副作用?
似乎答案是否定的,因为现在iPhone的性能相当快.那么为什么这么多人还在使用non-atomic呢?
即使atomic不保证线程安全,但它仍然比没有好,对吧?
jus*_*tin 34
即使是原子也不能保证线程安全,但它仍然比没有好,对吧?
错了.编写了一些非常复杂的并发程序后,我建议完全相反.您应该保留atomic使用它真正有意义的时间 - 并且您可能无法完全理解这一点,直到您编写并发程序而不使用它atomic.如果我正在编写多线程程序,我不希望屏蔽编程错误(例如竞争条件).我希望并发问题响亮而明显.这样,它们更容易识别,复制和纠正.
一些线程安全比没有更好的信念是有缺陷的.该程序是线程安全的,或者不是.使用atomic可以使程序的这些方面更能抵抗与并发相关的问题,但这并不会给你带来太大的影响.当然,可能会有更少的崩溃,但程序仍然毫无疑问是不正确的,它仍将以神秘的方式爆炸.我的建议:如果你不打算花时间学习和编写正确的并发程序,那就让它们保持单线程(如果听起来有点苛刻:它并不意味着苛刻 - 它会让你免于很多麻烦).多线程和并发是一个庞大而复杂的主题 - 学习在许多领域编写真正正确,长期存在的程序需要很长时间.
当然,atomic在某些情况下可以用来实现线程安全 - 但是使每个访问原子都不能保证线程安全.同样,非常不寻常(统计上)atomic单独的属性会使类真正的线程安全,特别是当类的复杂性增加时; 更有可能的是,只有一个具有5个ivars的类,使用一个ivar的类是真正安全的.atomic属性是我很少使用的功能(同样,一些非常大的代码库和并发程序).如果原子能使一个类真正的线程安全,它实际上是一个极端的案例.
性能和执行复杂性是避免它们的主要原因.与非原子访问相比,以及访问变量的频率和简单性,使用原子非常快.也就是说,原子访问相对于它们执行的任务引入了大量的执行复杂性.
自旋锁是实现原子属性的一种方式.那么,你是否想要一个同步原语,如自旋锁或互斥锁,隐含地围绕每个 get和set,知道它不保证线程安全吗?我当然不会!在您的实现中使每个属性访问原子可能会消耗大量的CPU时间.只有当你有明确的理由时才应该使用它(也是由dasblinkenlicht + 1提到).实现细节:一些访问不需要旋转锁来维护atomic; 它取决于几个方面,例如体系结构和变量的大小.
那么回答你的问题"任何副作用?" 在TL; DR格式:性能是你注意到的主要原因,而原子保证的适用性以及它对你有用的在你的抽象层次上是非常狭窄的(经常被误解),它掩盖了真正的错误.
das*_*ght 15
你不应该为你不使用的东西买单.与插入式计算机的CPU循环时间成本不同,移动设备上的CPU周期会花费您的时间和电池使用时间.如果您的应用程序是单线程的,则没有理由使用atomic,因为锁定和解锁操作会浪费时间和电池.电池比时间更重要:虽然与额外操作相关的延迟可能对最终用户不可见,但是花费的周期将减少移动设备在单次充电后可以工作的时间,这是一个很大的措施.用户认为非常重要.
| 归档时间: |
|
| 查看次数: |
5953 次 |
| 最近记录: |