今天在处理多线程突然想到一个问题,多核处理器会不会导致,单一线程中,由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并发编程之谈谈线程中的“锁机制”(三)

    大家好,并发编程 进入第三篇. 今天我们来讲讲,线程里的锁机制. 本文目录 何为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()函数【转】

    本文转载自: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.post()源码分析——在子线程中更新UI

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

随机推荐

  1. php-fpm进程关闭与重启脚本详解(转)

    先来理解一下什么是php-fpm PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的. PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中.必须将 ...

  2. idea中的svn配置

    idea的使用之svn篇--有图超详细 http://ylq365.iteye.com/blog/1955291

  3. FireBug调试工具笔记

         Firebug是网页浏览器 Mozilla Firefox下的一款开发类插件, 现属于Firefox的五星级强力推荐插件之一.它集HTML查看和编辑.Javascript控制台.网络状况监视 ...

  4. [转]Informatica vs SSIS

    转自 http://blog.csdn.net/thy822/article/details/8489779 这篇文章, 我不能同意更多, 所以转在这里. Here is my thinking af ...

  5. [译]AngularJS Service vs Factory - Once and for all

    原文: http://blog.thoughtram.io/angular/2015/07/07/service-vs-factory-once-and-for-all.html Service和Fa ...

  6. 必须知道的.net(性能条款)

    以dispose的模式来代替finalize方式:非托管资源的清理主要有终止化操作和Dispose模式两种,其中Finalize方式存在执行时间不确定,运行顺序不确定,同时对垃圾回收的性能有极大的损伤 ...

  7. 使用Carthage安装第三方Swift库

    http://blog.crazyphper.com/?p=3661 carthage update

  8. ubutu之qq安装

    1.压缩包下载链接 http://pan.baidu.com/s/1nvlgsGh 2.安装教程(引用自百度经验) 如何在Ubuntu中安装QQ

  9. 真有用?Snap和Flatpak 通吃所有发行版的打包方式。

    导读 最近我们听到越来越多的有关于Ubuntu的Snap包和由Red Hat员工Alexander Larsson创造的 Flatpak (曾经叫做 xdg-app)的消息.这两种下一代打包方法在本质 ...

  10. Linux下6种优秀的邮件传输代理

    导读 在互联网上,邮件客户端向邮件服务器发送邮件然后将消息路由到正确的目的地(其他客户),其中邮件服务器使用的一个网络应用程序称为邮件传输代理(MTA). 最好的Linux邮件传输代理(MTAs) 邮 ...