美文网首页
iOS多线程-多线程同时使用一块资源

iOS多线程-多线程同时使用一块资源

作者: 丶Honour | 来源:发表于2017-10-25 11:04 被阅读0次

忽然想起前段时间给一朋友解决互斥锁的问题, 之前忘了整理,现在想起来了,记录下

在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题:
方法一,@synchronized(id anObject),(最简单的方法)
会自动对参数对象加锁,保证临界区内的代码线程安全
Objective-C支持程序中的多线程。这就意味着两个线程有可能同时修改同一个对象,这将在程序中导致严重的问题。为了避免这种多个线程同时执行同一段代码的情况,Objective-C提供了@synchronized()指令。
指令@synchronized()通过对一段代码的使用进行加锁。其他试图执行该段代码的线程都会被阻塞,直到加锁线程退出执行该段被保护的代码段,也就是说@synchronized()代码块中的最后一条语句已经被执行完毕的时候。
指令@synchronized()需要一个参数。该参数可以使任何的Objective-C对象,包括self。这个对象就是互斥信号量。他能够让一个线程对一段代码进行保护,避免别的线程执行该段代码。针对程序中的不同的关键代码段,我们应该分别使用不同的信号量。只有在应用程序编程执行多线程之前就创建好所有需要的互斥信号量对象来避免线程间的竞争才是最安全的

@synchronized(self)  
{  
       // 这段代码对其他 @synchronized(self) 都是互斥的         
  
       // self 指向同一个对象  
} 

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

NSLock *theLock = [[NSLock alloc] init];   
if ([theLock lock])   
{  
   //do something here  
   [theLock unlock];   
} 

方法三,NSRecursiveLock,递归锁
NSRecursiveLock,多次调用不会阻塞已获取该锁的线程。

 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,条件锁,可以设置条件

//公共部分  
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强行获取锁。
最后附上git链接 : https://github.com/HonourZ/LockTest.git

相关文章

  • iOS多线程-多线程同时使用一块资源

    忽然想起前段时间给一朋友解决互斥锁的问题, 之前忘了整理,现在想起来了,记录下 在iOS中有几种方法来解决多线程访...

  • 多线程安全问题及各种锁

    1.多线程的安全 多线程使用不当会出现资源竞争,比如多个线程同时对一块资源进行修改,就会很容易引发数据错乱和数据安...

  • iOS 通知多线程的使用

    iOS 通知多线程的使用 iOS 通知多线程的使用

  • 多线程概念

    多线程概念: 是同步完成多项任务,提高资源多使用效率,多核的CPU运算多线程更为出色,在iOS应用中,对多线程的最...

  • iOS复习之多线程

    关于iOS多线程,你看我就够了iOS多线程--彻底学会多线程使用dispatch_group来进行线程同步 iOS...

  • iOS 多线程基础

    转自:iOS 多线程基础 - 简书 多线程同步和异步的区别?IOS中如何实现多线程的同步? 异步:可以同时执行多条...

  • 多线程:iOS中的多线程实现方案

    一、iOS的多线程方案二、NSThread的简单使用三、NSOperation的简单使用 一、iOS的多线程方案 ...

  • 整理一下知识点

    iOS多线程的使用 iOS核心优化

  • iOS多线程相关面试题

    iOS多线程demo iOS多线程之--NSThread iOS多线程之--GCD详解 iOS多线程之--NSOp...

  • 多线程之--NSOperation

    iOS多线程demo iOS多线程之--NSThread iOS多线程之--GCD详解 iOS多线程之--NSOp...

网友评论

      本文标题:iOS多线程-多线程同时使用一块资源

      本文链接:https://www.haomeiwen.com/subject/gaofpxtx.html