博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios 线程笔记(一)
阅读量:1523 次
发布时间:2019-04-21

本文共 1412 字,大约阅读时间需要 4 分钟。

      每个程序都至少有个一主线程,在没有显示的创建另一个线程的情况下,主线程从主函数开始执行然后负责执行剩下的应用代码。你可以把线程想成指令按顺序执行的应用的一行代码的执行。创建另外一个线程时,实际上在应用中就会有两个并发运行的独立线程。在单核的极其上运行,线程看起来是并发运行,但实际上它们会得到CPU分配的不同时间片段。在多核机器上就有可能是同时执行的。

     当两个线程并行执行时,有可能两个线程在同一时间访问试图访问相同的内存块,若这样便会导致程序出现错误,称作不安全的线程状态。所以必须防止一个线程在同一时间访问另一个线程正在访问的内存块,常用的方法是互斥锁(lock)和使用@synchronize关键字。

(一)NSLOCK

1.OC Foundation框架提供了两种主要的互斥锁。第一种是简单的NSLOCK类。NSLOCK表示一种可以实例化然后可以在写入特定变量或者内存位置时进行锁定的简单互斥体。锁定NSLOCK对象会阻塞线程直至解锁。这样锁定的NSLOCK对象就可以在第一个线程访问结束前阻止其他线程对数据的访问。

2.第二种方法:-lockBeforeDate阻塞线程一段时间直至到指定时间。

NSLOCK的最大问题就是如果错误的尝试锁一个已经被锁在线程锁住的锁,结果就会发生“死锁”。因为尝试锁定该锁会导致阻塞当前线程,你要等待前一个锁被解锁,但是前一个锁永远不可能被解锁,因为已被后一个锁住。可以用NSResursiveLock解决,其作用就是记录锁定他的线程,若线程再次尝试锁定,就会立刻返回。

(二)@synchronize关键字

@synchronized 该指令提供一个包括了特定作用域和变量参数的内置的底层互斥锁机制。意味着其可以为一个特定变量指定锁并让该锁在特定的代码域存在。

-(void)setSomeVar:(id)inValue

{

    [inValue retain];

    @synchronized(someVar)

    {

        id originalValue = someVar;

        someVar = inValue;

        [originalValue release];

    }

}

通常@synchronized指令和self变量一起使用来指定整个对象都在@synchronized块的作用域中被锁定

-(void)setSomeVar:(id)inValue

{

    [inValue retain];

    @synchronized(self)

    {

        id originalValue = someVar;

        someVar = inValue;

        [originalValue release];

    }

}

@synchronized的优点就是因为它指定了锁的作用域,如果发生异常情况导致其退出该作用域,锁就会释放。

注:

1.在使用线程的应用中要小心使用通知,因为通知可以发布在它们的线程上发送,这就意味着如果从后台线程发送通知来更新GUI组件,就有可能出现线程安全问题。

2.不可变的Foudation类,如NSString,NSDictionary,NSSet等,由于创建后无法修改因此也自然被认定是线程安全的。但是存储它们的变量则不会,因此在修改过程中要通过锁保护。

 

转载于:https://www.cnblogs.com/xcy617/archive/2013/01/23/2873240.html

你可能感兴趣的文章
本子笔从来不用,你开会带着装什么样子?
查看>>
nginx配置https
查看>>
webRTC:jssip登录freeswitch的正确办法及代码
查看>>
Ubuntu截屏功能
查看>>
U盘插在前面板不认,可以试试插在后面板
查看>>
测试webRTC时浏览器机器一定要有摄像头
查看>>
总感觉这个访问量过于均匀……
查看>>
全网首发:研究WORD布局,会意之笑
查看>>
全网首发:WORD应该是布局绘制二合一
查看>>
由UBUNTU20回到UBUNTU18
查看>>
终于有一次,排名没有进步
查看>>
糙哥、糙姐:指为了解决问题,随意调整参数的程序员
查看>>
别人回答工作中的问题,要自行判断是否正确
查看>>
全网首发:WORD你光标乱跳什么?
查看>>
全网首发:WORD取消了光标的方向
查看>>
实用技术会议通知:我知道你不会来,可是我不说是我的错
查看>>
Ribbon风格下,依然叫菜单或者菜单卡、菜单页
查看>>
软件基本功:垃圾代码是怎样产生的?
查看>>
H264 STAP-A解包代码(测试通过)
查看>>
软件基本功:以视频通话为例,交叉测试表格
查看>>