• Object-C 多线程中锁的使用-NSLock


    在多线程的编程环境中,锁的使用必不可少!
    于是,今天来总结一下为共享资源加锁的操作方法。
     
    一、使用synchronized方式
     

        //线程1

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            @synchronized(_myLockObj){

                [obj1 method1];

                sleep(30);

            }

            @synchronized(obj1){

            

            

            }

        });

        

        //线程2

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            sleep(1);

            @synchronized(_myLockObj){

                [obj1 method2];

            }

        });

        

    }

     
    这样,就会起到锁的作用,线程2会等待线程1执行完成@synchronized(obj){}块后,在执行。从而起到锁的作用。
     
    2.使用NSLock方式
     
    先贴一个例子:
     
    1. TestObj.h
     

    @interface TestObj : NSObject

    - (void)method1;

    - (void)method2;

    @end

     
    2. TestObj.m
     

    #import "TestObj.h"

    @implementation TestObj

     

    - (void)method1{

        NSLog(@"%@",NSStringFromSelector(_cmd));

        NSLog(@"Current thread = %@", [NSThread currentThread]);

        NSLog(@"Main thread = %@", [NSThread mainThread]);

    }

    - (void)method2{

        NSLog(@"%@",NSStringFromSelector(_cmd));

        NSLog(@"Current thread = %@", [NSThread currentThread]);

        NSLog(@"Main thread = %@", [NSThread mainThread]);

        

    }

    @end

     
    3.在需要锁的视图控制器中,申明锁对象。
     

     TestObj *obj = [[TestObj allocinit];

        NSLock *lock = [[NSLock allocinit];

    4.多线程状态下,锁操作

    //线程1

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            [lock lock];

            [obj method1];

            sleep(30);

            [lock unlock];

        });

        

        //线程2

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            sleep(5);//以保证让线程2的代码后执行

            [lock lock];

            [obj method2];

            [lock unlock];

        });

     
    5.总结
     

    使用时,基本方法就是:

    [lock lock];

    [obj yourMethod];

    [lock unlock];

    我们称[obj yourMethod]关键部分

    NSLock的执行原理:

    某个线程A调用lock方法。这样,NSLock将被上锁。可以执行“关键部分”,完成后,调用unlock方法。

    如果,在线程A 调用unlock方法之前,另一个线程B调用了同一锁对象的lock方法。那么,线程B只有等待。直到线程A调用了unlock。

    最后,还是看看API中对NSLock的一些说明

     

    @protocol NSLocking 

    lock 方法

    - (void)lock

    获得锁

    unlock 方法

    - (void)unlock

    释放锁

    @interface NSLock

    lockBeforeDate: 方法

    - (BOOL)lockBeforeDate:(NSDate *)limit

    在指定的时间以前得到锁。YES:在指定时间之前获得了锁;NO:在指定时间之前没有获得锁。

    该线程将被阻塞,直到获得了锁,或者指定时间过期。

    tryLock 方法

    - (BOOL)tryLock

    视图得到一个锁。YES:成功得到锁;NO:没有得到锁。

    setName: 方法

    - (void)setName:(NSString *)newName

    为锁指定一个Name

    name 方法

    - (NSString *)name

    返回锁指定的Name

    三、使用GCD中dispatch_semaphore_tdispatch_semaphore_wait
     

    TestObj *obj = [[TestObj allocinit];

        dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

        

        //线程1

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

            [obj method1];

            sleep(10);

            dispatch_semaphore_signal(semaphore);

        });

        

        //线程2

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            sleep(1);

            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

            [obj method2];

            dispatch_semaphore_signal(semaphore);

        });

    ------------------------------------------

    除此之外,还有NSCondition可以使用。

  • 相关阅读:
    python装饰器的4种类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类
    python中将函数赋值给变量时需要注意的一些问题
    python获得命令行输入的参数
    Python实现语音识别和语音合成
    pymysql
    Matplotlib
    级联,映射
    处理丢失数据
    Numpy,Pandas,Matplotlib
    crawlSpider,分布式爬虫,增量式爬虫
  • 原文地址:https://www.cnblogs.com/likwo/p/3350058.html
Copyright © 2020-2023  润新知