ios 单一线程中使用nsoperation 会导致资源竞争吗?

今天在处理多线程突然想到一个问题,多核处理器会不会导致,单一线程中,由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 网络请求发出,都不会同时修改一个我定义的计数变量,这个变量是安全的!

时间: 2024-11-05 22:08:36

ios 单一线程中使用nsoperation 会导致资源竞争吗?的相关文章

python-多线程同步中创建互斥锁解决资源竞争的问题

import threadingimport time # 定义一个全局变量g_num = 0 def test1(num): global g_num for i in range(num): g_num += 1 print('-------in test1 g_num={}'.format(g_num)) def test2(num): global g_num for i in range(num): g_num += 1 print('-------in test1 g_num={}'

iOS开发多线程基础知识 NSOperation

-------NSOperation简介---- 1.NSOperation的作用 ·配合使用NSOperation和NSOperationQueue也能实现多线程编程 2.NSOperation和NSOperationQueue实现多线程的具体步骤 ·先将需要执行的操作封装到一个NSOperation对象中 ·然后将NSOperation对象添加到NSOperationQueue中 ·系统会自动将NSOperation中封装的操作放到一条新线程中执行 ---------NSOperation的

为什么说invalidate()不能直接在线程中调用

1.为什么说invalidate()不能直接在线程中调用?2.它是怎么违背单线程的?3.Android ui为什么说不是线程安全的?4.android ui操作为什么一定要在UI线程中执行? 1.为什么说invalidate()不能直接在线程中调用?答:    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在非UI主线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用.例如:在非UI线程中调用

为何invalidate()不可以直接在UI线程中调用

1.android ui操作为什么一定要在主线程中执行? 答:Android UI操作是单线程模型,关于UI更新的相关API(包括invalidate())都是按照单线程设计的,对于多线程运行时不安全的,即在非主线程调invalidate()刷新界面出现异常.所以android禁止在非主线程更新UI. 2.为什么说invalidate()是线程不安全的?答:在非UI线程中调用invalidate会导致线程不安全,也就是说可能在非UI线程中刷新界面的时候,UI线程(或者其他非UI线程)也在刷新界面

Android中Toast如何在子线程中调用

当我们在应用的子线程中调用Toast的时候,我们会发现编译时并没有问题,但是当我们运行时就会出现如下错误 大专栏  Android中Toast如何在子线程中调用l/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="image"/> 通常我们都会认为此问题是因为在子线程中去更新UI导致的,其实不然,因为我们观察所抛出的log信息即可发现不是更新UI导致的,那么是什么原因导致的此问题呢 原文地址:https://www.cnblog

Python进阶(3)_进程与线程中的lock(互斥锁、递归锁、信号量)

1.同步锁 (Lock) 当各个线程需要访问一个公共资源时,会出现数据紊乱 例如: 1 import threading,time 2 def sub(): 3 global num #对全局变量进行操作 4 5 temp=num 6 time.sleep(0.001) #模拟线程执行中出现I/o延迟等 7 num=temp-1 #所有线程对全局变量进行减一 8 9 time.sleep(1) 10 11 num=100 12 l=[] 13 14 for i in range(100): 15

C++11线程指南(七)--资源竞争条件

1. 接口设计1 下面例子使用vector实现了一个栈.两个线程轮流从中弹出元素. #include <iostream> #include <thread> #include <mutex> #include <string> #include <vector> std::mutex myMutex; class Stack { public: Stack() {}; ~Stack() {}; void pop(); int top() { r

【iOS开发每日小笔记(九)】在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习. 一直想写一篇关于runloop学习有所得的文章,总是没有很好的例子.正巧自己的上线App Store的小游戏<跑酷好基友>(https://itunes.apple.com/us/app/pao-k

[转载]DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁

(转载于breaksoftware的csdn博客) 之前的几篇文章已经讲解了在DllMain中创建并等待线程导致的死锁的原因.是否还记得,我们分析了半天汇编才知道在线程中的死锁位置.如果对于缺乏调试经验的同学来说,可能发现这个位置有点麻烦.那么本文就介绍几个例子,它们会在线程明显的位置死锁掉. DLL中的代码依旧简单.它获取叫EVENT的命名事件,然后等待这个事件被激活.激活的操作自然放在线程中.这次我们不用在DLL中创建线程,而是在Exe中创建. switch (ul_reason_for_c