iOS多執行緒(二)

2021-09-29 03:58:26 字數 2720 閱讀 5833

osspinglock

os_unfair_lock

pthread_mutex

dispatch_semaphore

dispatch_queue(dispatch_queue_serial)

nslock

nsrecursivelock

nscondition

nsconditionlock

@synchronized

osspinglock 叫做「自旋鎖」,等待鎖的執行緒會處於忙等狀態(busy-wait),一直佔著cpu資源。

目前已經不再安全,可能會出現優先順序翻轉問題

如果等待鎖的執行緒的優先順序高,他會一直佔著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 乙個繼承自...