【问题标题】:In iOS @synchronized for 2 methods at once?在 iOS @synchronized 中同时使用 2 种方法?
【发布时间】:2015-01-03 20:29:20
【问题描述】:

通常@synchronized(self) 创建类似于临界区的东西。

我的问题是我有不止一个函数应该只能用一个线程访问。

但是如果我在每个这样的方法中写@synchronized(self),应用程序会做什么呢?这是否意味着一个线程可以使用method1而其他线程可以使用method2?如果没有,那么如何正确实现呢?

【问题讨论】:

  • “我有不止一个函数应该只用一个线程访问”这是有效的声明吗?我认为我们不能从单个线程一次运行两个函数。

标签: ios multithreading mutex synchronized critical-section


【解决方案1】:

@synchronized 尝试获取传递给它的对象的锁。如果获得锁,则继续执行。如果无法包含锁,则线程阻塞,直到可以获取锁为止。

您传递给@synchronized 的对象应该是您希望防止同时更新的对象。这可能是self,也可能是self 的属性。例如,考虑以下简单的队列实现:

@property (nonatomic,strong) NSMutableArray *qArray;

-(void)append:(id)newObject {
    @synchronized(self.qArray) {
        [self.qArray addObject:newObject];
    }
}

-(id) head {
   id ret=nil;
   @synchronized(self.qArray) {
       if (self.qArray.count >0) {
           ret=self.qArray[0];
           [self.qArray removeObjectAtIndex:0];
       }
   }
   return ret;
}

在这种情况下,self.qArray@synchronized 的不错选择,因为它是正在修改的对象

【讨论】:

  • 你能解释一下@synchronized(self) 是否只阻止self 或每个它的可变对象?
  • 当我说“您要保护的对象...”时,我想我的回答有点令人困惑 - @synchronized 不会像这样阻塞对象,它只会阻塞一个线程,直到它可以获取锁,其中锁由对象引用标识。如果我有访问/修改没有@synchronized 块的qArray 的代码,那么该代码仍然可以与@synchronized 块中的另一个线程同时运行-可能导致损坏。您需要勤奋并确保在任何需要的地方始终如一地使用@synchronized
  • 我是否应该假设您答案中对“self.myArray”的源代码引用是拼写错误或修订错误,应该是“self.qArray”?
  • 是的,这是一个错字
【解决方案2】:

来自某人

传递给@synchronized 指令的对象是用于区分受保护块的唯一标识符。如果您在两个不同的线程中执行上述方法,为每个线程上的 anObj 参数传递不同的对象,则每个线程都将获取其锁定并继续处理而不会被另一个线程阻塞。但是,如果在两种情况下都传递相同的对象,其中一个线程将首先获取锁,而另一个线程将阻塞,直到第一个线程完成临界区。

- (void)myMethod:(id)anObj
{

      @synchronized(anObj)
      {
          // Everything between the braces is protected by the @synchronized directive.
      }
}

【讨论】:

  • 所以如果我使用@synchronized(self)self 是一个单例,那么self 及其所有可变变量都受到保护,我不需要对这段代码做额外的事情吗?对吗?
【解决方案3】:

如果您通过一个线程访问两个(或更多)函数。 @synchronized 不会影响您的代码。因为您的函数在没有锁定帮助的情况下同步运行。

【讨论】:

  • 许多线程使用一个类的 2 种不同方法,它们使用相同的可变对象但通过不同的方式工作。
  • @synchronized 只是根据您传递的对象创建一个关键部分,然后它会阻止该部分代码。它不会阻止您传递的对象。例如,@synchronized(objA){ objB.element1;};如果两个线程访问这段代码,如果objA相同,则objB可以被块保护。但是线程可以使用线程不安全来修改 objA 的元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多