首页 > 系统 > iOS > 正文

iOS 多线程 锁 互斥 同步

2019-11-09 17:16:18
字体:
来源:转载
供稿:网友

在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题:

方法一,@synchronized(id anObject),(最简单的方法)会自动对参数对象加锁,保证临界区内的代码线程安全

[cpp] view plain copy PRint?@synchronized(self)    {           // 这段代码对其他 @synchronized(self) 都是互斥的                  // self 指向同一个对象    }   

方法二,NSLockNSLock对象实现了NSLocking protocol,包含几个方法:lock,加锁unlock,解锁tryLock,尝试加锁,如果失败了,并不会阻塞线程,只是立即返回NOlockBeforeDate:,在指定的date之前暂时阻塞线程(如果没有获取锁的话),如果到期还没有获取锁,则线程被唤醒,函数立即返回NO比如:

[cpp] view plain copy print?NSLock *theLock = [[NSLock alloc] init];   if ([theLock lock])   {     //do something here     [theLock unlock];   }   方法三,NSRecursiveLock,递归锁NSRecursiveLock,多次调用不会阻塞已获取该锁的线程。

[cpp] view plain copy print? NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init];    void MyRecursiveFunction(int value)   {    [theLock lock];    if (value != 0)   <span style="font-size:14px;"> </span>{       –value;       MyRecursiveFunction(value);    }   [theLock unlock];   }      MyRecursiveFunction(5);  

方法四,NSConditionLock,条件锁NSConditionLock,条件锁,可以设置条件

[cpp] view plain copy print?//公共部分  id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA];           //线程一,生产者   while(true) {           [condLock lockWhenCondition:NO_DATA];           //生产数据          [condLock unlockWithCondition:HAS_DATA];   }          //线程二,消费者   while (true) {           [condLock lockWhenCondition:HAS_DATA];           //消费          [condLock unlockWithCondition:NO_DATA];   }  

方法五,NSDistributedLock,分布锁NSDistributedLock,分布锁,文件方式实现,可以跨进程用tryLock方法获取锁。用unlock方法释放锁。如果一个获取锁的进程在释放锁之前挂了,那么锁就一直得不到释放了,此时可以通过breakLock强行获取锁。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表