【问题标题】:Interlocked operations in iOS?iOS中的联锁操作?
【发布时间】:2011-06-19 05:42:59
【问题描述】:

iOS SDK 中是否有互锁(原子)操作?

我需要联锁递增\递减和联锁比较。

*更新:* 我的主要问题是等待由主线程创建的几个 NSThreads(主线程不能工作,而其他线程工作)。

我不知道该怎么做。

【问题讨论】:

    标签: iphone objective-c ios concurrency


    【解决方案1】:

    您可以使用Using Atomic Operations 中描述的OSAtomicIncrement*/OSAtomicDecrement* 操作。

    【讨论】:

      【解决方案2】:

      更新:现在可以使用 C11 和 C++11 下的语言级原子。

      您可以简单地声明_Atomic(int) a;

      A more detailed introduction.


      原子操作及其文档可以在libkern/OSAtomic.h 中找到。可以在man atomic 下找到概述。

      同样,您可能很快就会发现 C11 和 C++11 语言/库支持。

      【讨论】:

      • C++11 支持已经有一段时间了,包括原子操作。
      • @Marko 谢谢。原来的答案现在已经 2 岁了——更新了。
      • 我认为简单地用 _Atomic() 声明是不够的。您还必须使用原子功能,例如要增加 _Atomic int,请使用 atomic_fetch_add(&i, 1);
      【解决方案3】:

      Objective-C 有关键字 synchronized 用于原子操作。

      @synchronized(object) {
          // ...
      }
      

      如果您在属性声明中指定属性 atomic,则 setter 和 getter 将使用这些同步块合成。

      同时查看NSLockNSLocking 协议。

      【讨论】:

      • 上次我读到,@synchronized 不是原子操作;这是两个成熟的互斥锁加上异常处理。
      【解决方案4】:

      您可以查看属性(ObjectiveC 2.0 功能)。

      @property int atomicProperty;

      实际上没有“原子”说明符,因为属性默认为原子。它们可以设置为“非原子”。

      http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html

      您也可能对@synchronized 感兴趣。或者文档的这一部分:

      http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html

      【讨论】:

      • 如果 someProperty 声明为原子,self.someProperty == 12345 是原子操作吗?
      • 我认为这是该属性的目的是的。它增加了一些针对并发访问的保护措施。
      猜你喜欢
      • 1970-01-01
      • 2018-10-12
      • 2010-10-30
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多