osspinglockosspinglock 叫做「自旋鎖」,等待鎖的執行緒會處於忙等狀態(busy-wait),一直佔著cpu資源。os_unfair_lock
pthread_mutex
dispatch_semaphore
dispatch_queue(dispatch_queue_serial)
nslock
nsrecursivelock
nscondition
nsconditionlock
@synchronized
目前已經不再安全,可能會出現優先順序翻轉問題
如果等待鎖的執行緒的優先順序高,他會一直佔著cpu資源,優先順序低執行緒就無法釋放鎖需要匯入標頭檔案 #import
//初始化
osspinlock lock = os_spinlock_init;
// 嘗試加鎖(如果需要等待就不加鎖,直接返回false,如果不需要等待就加鎖返回true)
bool result = osspinlocktry(&lock);
// 加鎖
osspinlocklock(&lock)
// 解鎖
osspinlockunlock(&lock)
os_unfair_lock用於取代不安全的osspinlock,從ios10開始才支援從底層呼叫看,等待os_unfair_lock鎖的執行緒會處於休眠狀態,並非忙等
需要匯入標頭檔案 #import
// 初始化
os_unfair_lock lock = os_unfair_lock_init;
// 嘗試加鎖
os_unfair_lock_trylock(&lock);
// 加鎖
os_unfair_lock_lock(&lock);
// 解鎖
os_unfair_lock_unlock(&lock);
mutex叫做「互斥鎖」,等待加鎖的線層會處於休眠狀態徐亞匯入標頭檔案 #import
// 初始化鎖的屬性
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,pthread_mutex_normal);
// 初始化鎖
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,&attr);
//嘗試加鎖
pthread_mutex_trylock(&mutex);
// 加鎖
pthread_mutex_lock(&mutex);
// 解鎖
pthread_mutex_unlock(&mutex);
// 銷毀相關資源
pthread_mutexattr_destroy(&attr);
pthread_mutex_destroy(&mutex);
/* * mutex type attributes
*/ #define pthread_mutex_normal 0
#define pthread_mutex_errorchecx 1
#define pthread_mutex_recursive 2
#define pthread_mutex_default pthread_mutex_normal
// 初始化鎖的屬性
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,pthread_mutex_recursive);
// 初始化鎖
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,&attr);
預計執行緒等待鎖的時間很短加鎖的**(臨界區)經常被呼叫,但競爭情況很少發生
cpu資源不緊張
多核處理器
預計執行緒等待時間較長單核處理器
臨界區有io操作
臨界區**複雜或者迴圈量大
臨界區競爭非常激烈
atomic用於保證屬性setter、getter的原子效能操作,相當於在getter和setter內部加了執行緒同步的鎖可以參考原始碼objc4的objc-accessors.mm
它並不能保證使用屬性的過程中是執行緒安全的。
同一時間,只能有乙個執行緒進行寫的操作同一時間,允許多個執行緒進行讀寫操作
同一時間,不允許既有寫的操作,還有讀的操作
pthread_rwlock: 讀寫鎖dispatch_barrier_async:非同步柵欄呼叫
IOS 多執行緒 RUNLOOP 機制 二
二,何時使用run loop 對於輔助線程,在需要和執行緒有更多互動時,才使用run loop。比如 1 使用埠或者自定義輸入源來和其他執行緒通訊 2 使用執行緒定時器 3 cocoa中使用任何performselector.的方法 參考 table performing selectors on ...
iOS多執行緒總結(二)NSOperation
nsoperation.h定義了nsoperation,內容非常的簡潔,nsoperation本身是乙個抽象類,定義了乙個要執行的task,nsoperationqueue是乙個task佇列,當task加入到佇列後,nsoperationqueue會自動按照優先順序及task的從屬依賴關係 如果有的...
iOS多執行緒
iphone 中的執行緒應用並不是無節制的,官方給出的資料顯示iphone os下的主線程的堆疊大小是1m,第二個執行緒開始都是512kb。並且該值不能通過編譯器開關或執行緒api函式來更改。只有主線程有直接修改ui的能力。一 nsoperation和nsoperationqueue 1 乙個繼承自...