CAS(Compare And Swap)をしたいんだけど
Lock-freeにしたいところがあってobjective-cでどうやって書くか調べてみました。
#import
とimport文を書いて
NSMutableArray * arrayA = [[NSMutableArray array] autorelease]; NSMutableArray * arrayB = [[NSMutableArray array] autorelease]; [arrayA addObject: [NSNumber numberWithInt:100]]; [arrayA addObject: [NSNumber numberWithInt:200]]; [arrayA addObject: [NSNumber numberWithInt:300]]; NSLog( @"arrayA:%@ arrayB:%@", arrayA, arrayB ); if ( OSAtomicCompareAndSwapPtr(arrayB, arrayA, (void * volatile *)&arrayB) ){ printf("success"); } NSLog( @"arrayA:%@ arrayB:%@", arrayA, arrayB );
という感じで、OSAtomicCompareAndSwapXXX関数を使えばいい。
メモリバリアあり版となし版があるようなので、そこは適宜。
他にどんな関数があるかはリファレンスを参照するとよさげ。
ARCを有効にしているとidからvoid*への変換が許されないようなので、ARCを無効になるようにプロジェクトを設定するか
-fno-objc-arc
ってオプションをつけておかないとダメです。