iOS中线程安全意味着什么?
我经常遇到关键术语“线程安全”,并想知道它是什么意思。例如,在Firebase或Realm中,某些对象被认为是“线程安全的”。对于线程安全的东西来说,这到底意味着什么?在搜索答案后,我从网站上得到了以下信息: 可以从多个线程或并发任务安全地调用线程安全代码,而不会导致任何问题(数据损坏、崩溃等)。非线程安全的代码一次只能在一个上下文中运行。线程安全代码的一个示例是let a=[“线程安全”]。此数组是只读的,您可以同时从多个线程使用它,而不会出现问题。另一方面,用var a=[“thread unsafe”]声明的数组是可变的,可以修改。这意味着它不是线程安全的,因为多个线程可以同时访问和修改数组,结果不可预测。变量和数据结构是可变的,并且不是固有的线程安全的,一次只能从一个线程访问iOS中线程安全意味着什么?,ios,swift,thread-safety,Ios,Swift,Thread Safety,我经常遇到关键术语“线程安全”,并想知道它是什么意思。例如,在Firebase或Realm中,某些对象被认为是“线程安全的”。对于线程安全的东西来说,这到底意味着什么?在搜索答案后,我从网站上得到了以下信息: 可以从多个线程或并发任务安全地调用线程安全代码,而不会导致任何问题(数据损坏、崩溃等)。非线程安全的代码一次只能在一个上下文中运行。线程安全代码的一个示例是let a=[“线程安全”]。此数组是只读的,您可以同时从多个线程使用它,而不会出现问题。另一方面,用var a=[“thread u
如果多个线程可以调用方法或访问对象的成员数据而没有任何问题,则称对象为线程安全的;“问题”广义上被定义为仅从一个线程访问时的行为偏差
例如,一个包含规则整数
i
的代码i=i+1
的对象将不是线程安全的,因为两个线程可能会遇到该语句,一个线程可能会读取i
的原始值,将其递增,然后写回该递增值;所有这些都与另一个线程同时发生。这样,i
将只增加一次,而它本应增加两次。线程不安全
-如果允许多个线程同时修改任何对象。
线程安全的
-如果任何对象不允许由多个线程同时修改
通常,不可变对象是线程安全的。
线程安全
意味着您的程序按预期工作。这是关于多线程环境的,我们在共享资源方面遇到了问题。这反过来又创造了:原子性、可见性、顺序性
苹果通过同步工具向我们提供:
原子性
原子操作
-基于硬件指令的无锁机制-例如比较和交换(CAS)。。。
- Objective-C
OSAtomic
,原子属性
可见性
易失性变量
-从内存读取值(无缓存)
- 目的-C挥发物
订购
内存屏障
-保证数据最新
- Objective-C存储载体
同步
锁
-线程可以获得锁,其他人无法访问资源<代码>NSLock
由线程队列、计数器值和hasSemaphore
和wait()
api组成<代码>信号量允许多个线程(计数器值)在给定时刻使用资源<代码>调度信号量,signal()
<代码>应用程序组允许共享POSIX信号量POSIX信号量-信号量
-互斥,互斥-是一种互斥
(允许多个线程),其中线程可以获取互斥,并且能够作为单个入侵者使用阻塞,所有其他线程将被阻塞,直到释放。与信号量
的主要区别在于lock
也在进程之间工作(不仅仅是线程)。它还包括mutex
内存屏障
,Objective-CPOSIX互斥锁-pthread\u Mutex\u t
@synchronized
-递归锁
-线程可以多次获取锁<代码>NSRecursiveLock锁重入
-等待线程根据轮询机制检查是否可以重复获得锁。这对于小型操作非常有用。在这种情况下,线程不会被阻塞,也不会执行诸如上下文切换之类的昂贵操作Spin lock
- pthread-
threadPOSIX
- NSThead
- 操作
- 举一个简单的例子。如果在多个线程之间共享某个内容而没有任何问题(如崩溃),则它是线程安全的。例如,如果您有一个常量(let value=[“Facebook”]),并且它在多个线程之间共享,那么它是线程安全的,因为它是只读的,不能修改。然而,如果您有一个变量(var value=[“Facebook”]),则在与多个线程共享时可能会导致崩溃或数据丢失,因为其数据可以修改。请参阅我回答中关于线程安全的评论。相关的这里有一些类似的讨论,包括我答案末尾的一个快速示例:看起来下面的解释对它的定义不同