iOS中线程安全意味着什么?

iOS中线程安全意味着什么?,ios,swift,thread-safety,Ios,Swift,Thread Safety,我经常遇到关键术语“线程安全”,并想知道它是什么意思。例如,在Firebase或Realm中,某些对象被认为是“线程安全的”。对于线程安全的东西来说,这到底意味着什么?在搜索答案后,我从网站上得到了以下信息: 可以从多个线程或并发任务安全地调用线程安全代码,而不会导致任何问题(数据损坏、崩溃等)。非线程安全的代码一次只能在一个上下文中运行。线程安全代码的一个示例是let a=[“线程安全”]。此数组是只读的,您可以同时从多个线程使用它,而不会出现问题。另一方面,用var a=[“thread u

我经常遇到关键术语“线程安全”,并想知道它是什么意思。例如,在Firebase或Realm中,某些对象被认为是“线程安全的”。对于线程安全的东西来说,这到底意味着什么?

在搜索答案后,我从网站上得到了以下信息:

可以从多个线程或并发任务安全地调用线程安全代码,而不会导致任何问题(数据损坏、崩溃等)。非线程安全的代码一次只能在一个上下文中运行。线程安全代码的一个示例是let a=[“线程安全”]。此数组是只读的,您可以同时从多个线程使用它,而不会出现问题。另一方面,用var a=[“thread unsafe”]声明的数组是可变的,可以修改。这意味着它不是线程安全的,因为多个线程可以同时访问和修改数组,结果不可预测。变量和数据结构是可变的,并且不是固有的线程安全的,一次只能从一个线程访问


如果多个线程可以调用方法或访问对象的成员数据而没有任何问题,则称对象为线程安全的;“问题”广义上被定义为仅从一个线程访问时的行为偏差


例如,一个包含规则整数
i
的代码
i=i+1
的对象将不是线程安全的,因为两个线程可能会遇到该语句,一个线程可能会读取
i
的原始值,将其递增,然后写回该递增值;所有这些都与另一个线程同时发生。这样,
i
将只增加一次,而它本应增加两次。

线程不安全 -如果允许多个线程同时修改任何对象。 线程安全的 -如果任何对象不允许由多个线程同时修改

通常,不可变对象是线程安全的。

线程安全
意味着您的程序按预期工作。这是关于多线程环境的,我们在共享资源方面遇到了问题。这反过来又创造了:
原子性、可见性、顺序性

苹果通过
同步工具向我们提供:

原子性

  • 原子操作
    -基于硬件指令的无锁机制-例如比较和交换(CAS)。。。
    • Objective-C
      OSAtomic
      原子属性
可见性

  • 易失性变量
    -从内存读取值(无缓存)
    • 目的-C挥发物
订购

  • 内存屏障
    -保证数据最新
    • Objective-C存储载体
同步

  • -线程可以获得锁,其他人无法访问资源<代码>NSLock

  • Semaphore
    由线程队列、计数器值和has
    wait()
    signal()
    api组成<代码>信号量
    允许多个线程(计数器值)在给定时刻使用资源<代码>调度信号量,
    POSIX信号量-信号量
    <代码>应用程序组允许共享POSIX信号量
  • 互斥
    -互斥,互斥-是一种
    信号量
    (允许多个线程),其中线程可以获取互斥,并且能够作为单个入侵者使用阻塞,所有其他线程将被阻塞,直到释放。与
    lock
    的主要区别在于
    mutex
    也在进程之间工作(不仅仅是线程)。它还包括
    内存屏障
    POSIX互斥锁-pthread\u Mutex\u t
    ,Objective-C
    @synchronized
  • 递归锁
    -
    锁重入
    -线程可以多次获取锁<代码>NSRecursiveLock
  • Spin lock
    -等待线程根据轮询机制检查是否可以重复获得锁。这对于小型操作非常有用。在这种情况下,线程不会被阻塞,也不会执行诸如上下文切换之类的昂贵操作
  • 操作

  • 多线程

    • pthread-
      POSIX
      thread
    • NSThead
    • 操作

      • 举一个简单的例子。如果在多个线程之间共享某个内容而没有任何问题(如崩溃),则它是线程安全的。例如,如果您有一个常量(let value=[“Facebook”]),并且它在多个线程之间共享,那么它是线程安全的,因为它是只读的,不能修改。然而,如果您有一个变量(var value=[“Facebook”]),则在与多个线程共享时可能会导致崩溃或数据丢失,因为其数据可以修改。

        请参阅我回答中关于线程安全的评论。相关的这里有一些类似的讨论,包括我答案末尾的一个快速示例:看起来下面的解释对它的定义不同