美文网首页
iOS多线程-常用的线程锁

iOS多线程-常用的线程锁

作者: Autolying | 来源:发表于2017-03-15 10:53 被阅读0次

在高并行的代码环境中,我们常常会碰到这样的情况:多个线程同时访问某一段代码,产生资源竞争,导致程序异常。线程锁可以帮我们解决这样的问题,它可以让这些并行的线程同步地访问这段代码,让我们的程序正常执行。通过解决下面这个问题(参见 http://www.jianshu.com/p/b3bd070cd372 ),介绍几种常用线程锁的用法。

- (void)testDispatchSemaphore
{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    NSMutableArray *mutableArray = [NSMutableArray array];

    for (int i = 0; i < 100000; ++i) {
        dispatch_async(queue, ^{
            [mutableArray addObject:[NSNumber numberWithInt:i]];
        });
    }
}

一、NSLock

    NSLock *lock = [[NSLock alloc] init];
    
    for (int i = 0; i < 100000; ++i) {
        dispatch_async(queue, ^{
            //加锁
            [lock lock];
            //需要加锁的代码
            [mutableArray addObject:[NSNumber numberWithInt:i]];
            //解锁
            [lock unlock];
        });
    }

三步:

  1. 初始化锁:
NSLock *lock = [[NSLock alloc] init];
  1. 对代码加锁:
 [lock lock];
  1. 对代码解锁:
[lock unlock];

二、pthread_mutex

    static pthread_mutex_t pLock;
    pthread_mutex_init(&pLock, NULL);
    
    for (int i = 0; i < 100000; ++i) {
        dispatch_async(queue, ^{
            //加锁
            pthread_mutex_lock(&pLock);
            //需要加锁的代码
            [mutableArray addObject:[NSNumber numberWithInt:i]];
            //解锁
            pthread_mutex_unlock(&pLock);
        });
    }

四步:

  1. 声明:
static pthread_mutex_t pLock;

这里需要声明为静态变量,不然参数类型不匹配。

  1. 初始化:
pthread_mutex_init(&pLock, NULL);
  1. 加锁
pthread_mutex_lock(&pLock);
  1. 解锁
pthread_mutex_unlock(&pLock);

三、@synchronized

    for (int i = 0; i < 100000; ++i) {
        dispatch_async(queue, ^{
            @synchronized (self) {
                [mutableArray addObject:[NSNumber numberWithInt:i]];
            }
        });
    }

最简单,但是性能最差

四、Dispatch Semaphore

我写的另一篇文章有分析到,详情见http://www.jianshu.com/p/b3bd070cd372

综合性能和可读性,我比较喜欢NSLock,对性能要求较高的童鞋可以使用pthread_mutex_t和Semaphore。自旋锁OSSpinLock被苹果工程师证实不安全,苹果使用pthread_mutex_t进行了替代,谷歌使用Semaphore。

相关文章

  • 起底多线程同步锁(iOS)

    起底多线程同步锁(iOS) 起底多线程同步锁(iOS)

  • 多线程 (三)iOS中的锁

    ios 多线程--锁

  • OC--各种线程锁

    参考:正确使用多线程同步锁@synchronized()iOS中的锁iOS多线程安全详解iOS 常见知识点(三):...

  • iOS开发中常用的几种锁

    iOS开发中常用的几种锁 简介: 操作系统在进行多线程调度的时候,为了保证多线程安全引入了锁的机制,以实现指定代码...

  • iOS常用锁的研究

    iOS常用锁的研究 背景 iOS并发编程除了常用的多线程技术外,线程间同步的方法也是另外一个重要的点. 公司的项目...

  • GCD练习

    GCD练习 ios 多线程 GCD : ios 多线程 全剧队列,异步执行 线程间通信 信号量 文件锁 单利模式 ...

  • iOS 多线程

    参考链接 iOS多线程iOS 多线程:『GCD』详尽总结iOS简单优雅的实现复杂情况下的串行需求(各种锁、GCD ...

  • iOS多线程-常用的线程锁

    在高并行的代码环境中,我们常常会碰到这样的情况:多个线程同时访问某一段代码,产生资源竞争,导致程序异常。线程锁可以...

  • iOS 多线程

    iOS中的各种锁iOS多线程到底不安全在哪里?

  • 浅析乐观锁、悲观锁与CAS

    乐观锁与悲观锁 处理多线程并发访问最常用的就是加锁,锁又分成乐观锁和悲观锁。 悲观锁 在多线程访问共享资源时,同时...

网友评论

      本文标题:iOS多线程-常用的线程锁

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