1. ホーム
  2. objective-c

[解決済み] Swiftの変数はアトミックか?

2022-12-19 09:02:02

質問

Objective-Cでは、アトミックプロパティと非アトミックプロパティを区別していますね。

@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;

私の理解では、アトミックと定義されたプロパティを複数のスレッドから安全に読み書きできますが、アトミックでないプロパティやivarを複数のスレッドから同時に読み書きアクセスすると、不正アクセスエラーを含む未定義の動作になる可能性があります。

つまり、Swiftでこのような変数があった場合。

var object: NSObject

この変数の読み書きを安全に並列で行うことはできますか?(実際に行う意味は考えずに)。

どのように解決するのですか?

低レベルのドキュメントがないので決めつけるのは早計ですが、アセンブリから勉強することは可能です。 ホッパーディスアセンブラ は素晴らしいツールです。

@interface ObjectiveCar : NSObject
@property (nonatomic, strong) id engine;
@property (atomic, strong) id driver;
@end

用途 objc_storeStrongobjc_setProperty_atomic はそれぞれ非原子と原子の場合、ここで

class SwiftCar {
    var engine : AnyObject?    
    init() {
    }
}

swift_retain から libswift_stdlib_core であり、どうやらスレッドセーフは組み込まれていないようです。

私たちは、追加のキーワード( @lazy のような)追加のキーワードが後で導入されるかもしれないと推測できます。

2015年7月20日更新 : これによると シングルトーンに関するブログ記事 swift環境では、特定のケースをスレッドセーフにすることができます。

class Car {
    static let sharedCar: Car = Car() // will be called inside of dispatch_once
}

private let sharedCar: Car2 = Car2() // same here
class Car2 {

}

2016年05月25日更新 : 迅速な進化提案に注目 https://github.com/apple/swift-evolution/blob/master/proposals/0030-property-behavior-decls.md - ができるようになるようです。 @atomic の挙動を自分で実装することができそうです。