ios 单一线程中的Runloop机制会导致线程安全问题吗?

时间:2022-09-25 18:34:55

今天在处理多线程突然想到一个问题,多核处理器会不会导致,单一线程中,由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 = ;i<;i++){
NSLog(@"");
} } - (void)test2{
for(int i = ;i<;i++){
NSLog(@"");
} }

结果就是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 运行,也就不会产生线程安全问题。

ios 单一线程中的Runloop机制会导致线程安全问题吗?的更多相关文章

  1. Python并发编程之谈谈线程中的&OpenCurlyDoubleQuote;锁机制”(三)

    大家好,并发编程 进入第三篇. 今天我们来讲讲,线程里的锁机制. 本文目录 何为Lock( 锁 )?如何使用Lock( 锁 )?为何要使用锁?可重入锁(RLock)防止死锁的加锁机制饱受争议的GIL( ...

  2. 在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法

    一直想写一篇关于runloop学习有所得的文章,总是没有很好的例子.游戏中有一个计时功能在主线程中调用: 1 + (NSTimer *)scheduledTimerWithTimeInterval:( ...

  3. 线程暴长~Quartz中创建Redis频繁后导致线程暴长

    在最近项目开发过程中,在进行任务调度处理过程中,出现了一个问题,它的线程数暴长,从20多个可以到1000多个,如果你的服务器性能好的话,可以到10000多个,太恐怖了,就算你的服务再好,早晚有一天也会 ...

  4. 线程中CreateEvent和SetEvent及WaitForSingleObject的用法

    首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面. CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象. EVENT有两种状态 ...

  5. 多线程中的信号机制--signwait&lpar;&rpar;函数【转】

    本文转载自:http://blog.csdn.net/yusiguyuan/article/details/14237277 在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别, ...

  6. Android中对Handle机制的理解

    一.重要參考资料  [參考资料]     眼下来看,以下的几个网址中的内容质量比較不错.基本不须要再读别的网址了. 1.android消息机制一     http://xtfncel.javaeye. ...

  7. 重点:怎样正确的使用QThread类(很多详细例子的对比,注意:QThread 中所有实现的函数是被创建它的线程来调用的,不是在线程中)good

    背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt ...

  8. 线程中的WaitForSingleObject和Event的用法

    http://chinaxyw.iteye.com/blog/548622 首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面. CreateEvent ...

  9. Android多线程之(一)View&period;post&lpar;&rpar;源码分析——在子线程中更新UI

    提起View.post(),相信不少童鞋一点都不陌生,它用得最多的有两个功能,使用简便而且实用: 1)在子线程中更新UI.从子线程中切换到主线程更新UI,不需要额外new一个Handler实例来实现. ...

随机推荐

  1. iOS self

    如果self在对象方法中 那么self就代表调用当前对象方法的那个对象 如果self在类方法中 那么self就代表调用当前类方法的那个类 总结:self的使用只需关注self在哪个方法中 如果在类方法 ...

  2. Python笔记(2)函数

    python中一切皆对象,函数也看做对象.函数被函数名所引用,但是同样的他也可以被其他标识符所引用,可以作为参数传递. def f(): return "hi" 可见a引用了函数返 ...

  3. android post带数据请求方式,传递的数据格式包括json和map

    如下: public static String httpPost(String url, String json) { try { URL u = new URL(url); HttpURLConn ...

  4. memcache 安装

    1 下载两个文件 wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz wget http://www.monkey.org/ ...

  5. 如何解决winows启动后出现grub&quest;

    village :村庄, 村民 villa: 别墅 setting: 设置; ** 环境, 背景, 布置, 布局, 底座 what's the setting of the villa like? h ...

  6. linux系统如何将系统中的文件名改为英文?

    由于我们经常在命令行模式下进入文件,那么中英文的切换常常会影响我们输入的效率. 那么如何将原来的中文修改成英文的字幕呢? 如下图所示: -------------------------------- ...

  7. s3c6410&lowbar;uart初始化及读写

    参考: 1)<USER'S MANUAL-S3C6410X>第31章 UART 2)u-boot uart初始化及读写:u-boot-x.x.x/board/samsumg/smdk641 ...

  8. 【转】perl中尖括号运算符&lpar;<>&rpar;使用说明

    perl中尖括号运算符的用途分享,这里简单介绍下,方便需要的朋友 perl中<>运算符可以有如下的用途: 1)如果尖括号中间是文件句柄,尖括号运算符允许你读取文件句柄,比如<STDI ...

  9. IIS连接数

    IIS连接数,也叫IIS并发数(Current Connections),是指同一时间内,有多少个对服务器的请求 一般情况下一个浏览器会占用2个IIS连接 同一个浏览器(IE.Firefox等)窗口中 ...

  10. C&num; - String与StringBuilder

    A String object is called immutable (read-only), because its value cannot be modified after it has b ...