ios 线程笔记(一)
发布日期:2021-06-24 07:06:11 浏览次数:5 分类:技术文章

本文共 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

转载地址:https://blog.csdn.net/weixin_30896763/article/details/99420140 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C#二进制与字符串之间的相互转换
下一篇:KVC 字典转模型构造函数

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月12日 13时48分39秒