3

メソッド本体で @synchronized ディレクティブを使用する

-(void)testSynchronizeMethod:(int)value
{
    @synchronized(value)
    {
        int value1 = 100; //sample line 1
        int value2 = 120; //sample line 2
        [self calledMethod];
    }
}

//case 1
-(void)calledMethod
{
    NSLog(@"is @synchronized directive applied to this method");
    NSLog(@"what happens if I enclose this method with @synchronized directive");
}

**or**
//case 2
-(void)calledMethod
{
    @synchronized(value){
        NSLog(@"is @synchronized directive applied to this method");
        NSLog(@"what happens if I enclose this method with @synchronized directive");
    }
}

Q:ケース 2 の場合、'-(void)calledMethod' の周りに 2 つのミューテックス ロックが作成されていますか?

編集このようなミューテックスロックを使用しているときに、メインスレッドでシグナル SIGINT を取得しています。何がうまくいかないのか誰かが私に提案できるなら、私はスクリーングラブを添付していますか?ここに画像の説明を入力

4

1 に答える 1

4

はい、同時にいいえ。docs@synchronizedによると、再帰的なロックです。つまり、2 つのミューテックス ロック作成されますが、デッドロックは発生せず、両方とも適切に破棄されます。

ただし、注意すべきことは、この素晴らしい「再帰的」ロックは非常に高価であり、状況がサポートする場合は別の形式のミューテックス (NSLock、NSConditionLock など) を使用する必要があることです。

@synchronizedは素晴らしいキーワードです。誤解しないでください。ただし、必要のない場所にむやみに投げ込むだけではいけません。

于 2013-03-01T13:04:12.880 に答える