Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

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関数を使えばいい。

メモリバリアあり版となし版があるようなので、そこは適宜。

他にどんな関数があるかはリファレンスを参照するとよさげ。

http://developer.apple.com/library/mac/#documentation/System/Reference/OSAtomic_header_reference/Reference/reference.html


ARCを有効にしているとidからvoid*への変換が許されないようなので、ARCを無効になるようにプロジェクトを設定するか
-fno-objc-arc
ってオプションをつけておかないとダメです。