【问题标题】:Use of @synchronized directive - Objective-C Mutex Lock iOS@synchronized 指令的使用 - Objective-C 互斥锁 iOS
【发布时间】:2013-03-01 12:58:15
【问题描述】:

在方法主体上使用@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");
    }
}

问: 情况 2 是否围绕 '-(void) calledMethod' 创建了两个互斥锁?

编辑我在使用此类互斥锁时在主线程上收到信号 SIGINT。 如果有人可以建议我出了什么问题,我将附上屏幕截图?

【问题讨论】:

  • @synchronized 如何在int 上工作???
  • @HotLicks 忽略这一点。刚刚测试过,根据this apple doc 你是正确的。我的错。
  • A SIGINT 意味着线程在等待某事完成时被中断,在这种情况下是为了访问您的互斥锁。我会考虑使用调度回调而不是使用 @synchronized 轮询数据。
  • 但是根据苹果文档@synchronized 会自动为您处理所有可能的异常?为什么这个例外不成立?

标签: ios objective-c multithreading


【解决方案1】:

是的,同时不是。 @synchronized 是根据docs 的递归锁,这意味着创建了两个互斥锁,但它们不会导致死锁并且都被正确销毁。

但是,需要注意的是,这种令人敬畏的“递归”锁定非常昂贵,如果情况支持,可能应该使用另一种形式的互斥锁(NSLock、NSConditionLock 等)。

@synchronized 是一个了不起的关键字,不要误会我的意思,但不要随便把它扔到不需要它的地方。

【讨论】:

  • 感谢您的回复,请检查我的编辑。这种崩溃我快疯了。
猜你喜欢
  • 2012-02-02
  • 1970-01-01
  • 2021-08-19
  • 2011-08-10
  • 2022-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多