zoukankan      html  css  js  c++  java
  • ios 单一线程中的Runloop机制会导致线程安全问题吗?

    今天在处理多线程突然想到一个问题,多核处理器会不会导致,单一线程中,由runloop分发的2个函数同时执行呢?进而同时修改同一个变量,产生bug?

    我做了以下的测试:

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [self performSelectorOnMainThread:@selector(test1) withObject:nil waitUntilDone:NO];
        [self performSelectorOnMainThread:@selector(test2) withObject:nil waitUntilDone:NO];
        
        NSLog(@"view did load end!");
    }
    
    
    - (void)test1{
        for(int i = 0;i<10000;i++){
            NSLog(@"1111111111111111111");
        }
    
    }
    
    - (void)test2{
        for(int i = 0;i<10000;i++){
            NSLog(@"222222222222222222");
        }
    }

    结果就是11111全部输出完毕后,才有22222的输出,可见多核心的处理器,也会保证单一thread不出现并发执行2个函数的情况!

    这个结论有什么用呢?大家可以看一下box(一个类似百度云的东西) 的api ,它里面的网络请求是用operationQueue发出的operation,但是真实的业务逻辑,是在自己创建的唯一一个thread中通过performSelector 执行的,所以无论多少的box 网络请求发出,都不会同时修改一个我定义的计数变量,这个变量是安全的!另外,同一个线程里的connection didreceivedata 函数是通过向 nsrunloop 加 source实现的,不是同步阻塞的,所以会出现2个网络请求在同一个线程里同时返回数据的情况,但是这并不会影响这个结论:单一线程中操作同一个变量是安全的,不会产生数据不一致情况

    今天看coredata资料的时候发现了这句话:

    Core Data uses thread (or serialized queue) confinement to protect managed objects and managed object contexts.

    其实,这也是在说明,thread 和 serialized quque 都有这个特性:同一时刻只会有一个runloop action 运行,也就不会产生线程安全问题。 

  • 相关阅读:
    1.Spring MVC详解
    servlet的九大内置对象
    Hibernate设置事务的隔离级别
    wamp下php报错session_start(): open(d:/wamp/tmpsess_ku776hvb06ko4lv9d11e7mnfj1, O_RDWR) failed: No such file or directory
    json_decode()相关报错
    wamp下var_dump()相关问题
    es6箭头函数内部判断
    Json数组对象取值
    npm指向淘宝源
    APICloud之封装webApp
  • 原文地址:https://www.cnblogs.com/breezemist/p/4882513.html
Copyright © 2011-2022 走看看