iOS 线程同步 NSLock、NSRecursiveLock、NSCondition

#import "ViewController.h"
#import <pthread.h>
@interface ViewController ()
@property (nonatomic, strong) NSCondition *lock;
@property (nonatomic, strong) NSMutableArray *data;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];

    self.lock = [[NSCondition alloc]init];
    self.data = [NSMutableArray array];

    [self test];
    // Do any additional setup after loading the view.
}
//同时执行 删除 添加操作
-(void)test{
    [[[NSThread alloc]initWithTarget:self selector:@selector(add) object:nil] start];
    [[[NSThread alloc]initWithTarget:self selector:@selector(remove) object:nil] start];
}
-(void)add{
    sleep(1);
    [self.lock lock];
    [self.data addObject:@"A"];
    NSLog(@"添加数据");
    //发送信号通知条件能继续往下执行
    [self.lock signal];
    //广播信号 对应的条件能往下继续执行了
//    [self.lock broadcast];
    [self.lock unlock];

}
-(void)remove{
    NSLog(@"开始删除数据");
    [self.lock lock];
    if (self.data.count==0) {
        //这时候会等待条件、并且打开当前锁、
        //收到条件信号之后会重新加锁并执行后面的代码
        [self.lock wait];
    }
    [self.data removeLastObject];
    [self.lock unlock];
    NSLog(@"删除数据");
}

原文地址:https://www.cnblogs.com/ZhangShengjie/p/12289323.html

时间: 2024-08-30 12:29:54

iOS 线程同步 NSLock、NSRecursiveLock、NSCondition的相关文章

iOS线程同步和锁

应用程序里面多个线程的存在引发了多个执行线程安全访问资源的潜在问题.两个线程同时修改同一资源有可能以意想不到的方式互相干扰. iOS 提供了你可以使用的多个同步工具,从提供互斥访问你程序的有序的事件的工具等.以下个部分介绍了这些工具和如何在代码中使用他们来影响安全的访问程序的资源. 我们通过同一个例子来说明这些锁,当两个线程同时操作一个可变数组时,一个线程添加数据,一个线程删除数据,类似一个生产消费者模式,就会存在线程安全问题: 使用POSIX互斥锁 __block pthread_mutex_

iOS 线程同步 自旋锁 OSSpinLock

#import "ViewController.h" #import <libkern/OSAtomic.h> @interface ViewController () @property (nonatomic,assign) int ticket; //@property (nonatomic,assign) OSSpinLock lock; @end @implementation ViewController - (void)viewDidLoad { [super

线程同步-iOS多线程编程指南(四)-08-多线程

首页 编程指南 Grand Central Dispatch 基本概念 多核心的性能 Dispatch Sources 完结 外传:dispatch_once(上) Block非官方编程指南 基础 内存管理 揭开神秘面纱(上) 揭开神秘面纱(下) iOS多线程编程指南 关于多线程编程 线程管理 Run Loop 线程同步 附录 Core Animation编程指南 Core Animation简介 基本概念 渲染架构 几何变换 查看目录 中文手册/API ASIHTTPRequest Openg

iOS多线程编程:线程同步总结 NSCondtion

1:原子操作 - OSAtomic系列函数 iOS平台下的原子操作函数都以OSAtomic开头,使用时需要包含头文件<libkern/OSBase.h>.不同线程如果通过原子操作函数对同一变量进行操作,可以保证一个线程的操作不会影响到其他线程内对此变量的操作,因为这些操作都是原子式的.因为原子操作只能对内置类型进行操作,所以原子操作能够同步的线程只能位于同一个进程的地址空间内. 2:锁 - NSLock系列对象 iOS平台下的锁对象为NSLock对象,进入锁通过调用lock函数,解锁调用unl

IOS 多线程,线程同步的三种方式

一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IOS中我们一般情况下使用以下三种线程同步代码方式: 第一种和第二种代码同步的使用方法,一般情况下我们只需要使用NSLock和NSCondition申明2个属性.然后给此属性赋对应的值.那么即可作为安全防控的线程手段. 同时也可以保证线程的资源安全. 1:NSLock方式 [xxxlock   lock] //上锁 同步代码块 [xxxlock   unlock]//解锁 2:NSCondition

Java与iOS中的线程安全与线程同步

Java 中的线程安全与线程同步: 创建一个 Thread的实现类 MyThread , 作为线程体; 创建 Test 类, 在主函数中生成两个 Thread 对象, 两个对象公用一个线程体( MyThread 的对象 ); 线程安全: 避免多个线程同时访问统一资源; 解决办法: 加同步锁;  synchronized(this) { 要访问的资源; } iOS 中的线程安全与线程同步 线程安全: 同一资源在统一时间只能允许一个线程进行访问 解决办法: 方法一: 加同步锁 @synchroniz

线程同步和异步的区别?IOS中如何实现多线程的同步?

1.线程同步是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 ,串行执行任务 线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制,并行执行任务 1.2.3模式 使用GCD的主队列.使用NSOperationQueue,把最大线程数(并发)设为1    1.1.1 2.OC中是所有对象间的交互是如何实现的? 通过消息发送机制实现    对象---方法 3.描述上拉加载.下拉刷新的实现机制? 继承自滚动视图,滚动视图的两个属性offset (x,y)表示偏移量,inset

iOS线程编程指南

原英文网址为: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html 同步 在应用程序中的多个线程的存在开辟了潜在的问题,关于安全访问到资源从多个执行线程.两个线程修改相同的资源可能会相互干扰,以意想不到的方式.例如,一个线程可能会覆盖其他人的更改或应用程序置于未知和潜在无效的状态.如果你很幸运,已损坏的资源可能会导致

线程同步--线程间通信

一.线程同步 线程的同步方法跟其他系统下类似,我们可以用原子操作,可以用 mutex,lock 等. iOS 的原子操作函数是以 OSAtomic 开头的,比如:OSAtomicAdd32, OSAtomicOr32 等等.这些函数可以直接使用,因为它 们是原子操作. iOS 中的 mutex 对应的是 NSLock,它遵循 NSLooking 协议,我们可以使用 lock, tryLock, lockBeforeData:来加锁,用 unLock 来解锁.使用示例: BOOL moreToDo