• ios 线程笔记(一)


          每个程序都至少有个一主线程,在没有显示的创建另一个线程的情况下,主线程从主函数开始执行然后负责执行剩下的应用代码。你可以把线程想成指令按顺序执行的应用的一行代码的执行。创建另外一个线程时,实际上在应用中就会有两个并发运行的独立线程。在单核的极其上运行,线程看起来是并发运行,但实际上它们会得到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等,由于创建后无法修改因此也自然被认定是线程安全的。但是存储它们的变量则不会,因此在修改过程中要通过锁保护。

  • 相关阅读:
    MAC下通过改apache配置文件切换php多版本的方法
    mac配置php7运行环境
    VS Code 配置 C/C++ 环境(转)
    go语言中goroute使用:=遇到的坑
    python中执行shell的两种方法总结
    对于pycharm和vscode下,从外部复制文本内容为python字符串内容是会自动加u202a解决办法
    在macOS下正确配置 VS Code 使用 virtualenv 里的 python 环境参数
    github上传时出现error: src refspec master does not match any解决办法
    VSCode tasks.json中的各种替换变量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等
    Sonar入门(四):Eclipse集成Sonar
  • 原文地址:https://www.cnblogs.com/xcy617/p/2873240.html
Copyright © 2020-2023  润新知