正文
3). PNG
4). GIF
5). BMP
6). PCX
7). TIFF
8). ICO
9). CUR
10). IFF
11). ANI
以上是一些文件的区别方式,回答的总方向还是对的,可能回答的不够好,下次就知道了。
常见的几种线程锁
这个问题比较尴尬,因为英文不太好,加上平时用的也不多,回答的比较吞吞吐吐,就说了
NSLock
、
@synchronized
和
dispatch的semaphore
,
其中有些单词的读法还不太准,想想就很尴尬,下面大概总结一下,有一下几种:
-
NSLock
-
@synchronized
-
dispatch的semaphore
-
条件锁NSCondition
-
条件锁NSConditionLock
-
NSDistributedLock
-
互斥锁POSIX
-
自旋锁OSSpinLock
下面总结一下,说实话太多有点记不过来了 - . -,附带详细的
原文地址
:
各种线程锁
|
使用场景和简单介绍
|
@synchronized
|
适用线程不多,任务量不大的多线程加锁
|
NSLock
|
比较常用的一种锁,性能一般
|
dispatch_semaphore_t
|
使用信号来做加锁,性能很好
|
NSCondition
|
使用其做多线程之间的通信调用不是线程安全的
|
NSConditionLock
|
单纯加锁性能非常低,比NSLock低很多,但是可以用来做多线程处理不同任务的通信调用
|
NSRecursiveLock
|
递归锁的性能出奇的高,但是只能作为递归使用,所以限制了使用场景
|
NSDistributedLock
|
因为是MAC开发的,就不讨论了
|
POSIX(pthread_mutex)
|
底层的api,复杂的多线程处理建议使用,并且可以封装自己的多线程
|
OSSpinLock
|
性能也非常高,可惜出现了线程问题
|
再总结一下,总的意思就是一般用
dispatch_semaphore_t
就行了,再简单点用
NSLock
,
另外带一个
swift
出的一个线程锁的方式:
func synchronized(lock: AnyObject, closure: () -> ()) {
objc_sync_enter(lock)
closure()
objc_sync_exit(lock)
}
怎么保证线程安全
这个问题我是接着上一个问题之后回答的,感觉线程安全主要是数据竞争带来的,下面简单讲解一下:
线程安全的代码可以从多个线程或并发任务安全地调用,而不会造成任何问题(数据损坏,系统崩溃等)。例如当你多线程编程时,你用let定义一个数组,因为它是只读的,你能在同一时间不同线程去使用它,而不会造成线程安全的问题,然而当你用var定义一个数组时就不一样了,它不是线程安全的,当多个线程在同一时间访问和修改数组时会产生不可预知的结果。