#import "ViewController.h"
#import <libkern/OSAtomic.h>// OSSpinLock頭文件
#import <os/lock.h>// os_unfair_lock頭文件
#import <pthread.h>// pthread_mutex_t頭文件
#import <pthread.h>// pthread_rwlock_t頭文件
@interface ViewController ()
@property (nonatomic, strong) UIView *bgView;
@property (nonatomic) int count;
/// 自旋鎖-忙等
@property (nonatomic, assign) OSSpinLock ossLock;
/// NSLock-對pthread_mutex_t的封裝
@property (nonatomic, strong) NSLock *lock;
/// 隊列組
@property (nonatomic, strong) dispatch_group_t grounp;
/// os_unfair_lock-互斥鎖
@property (nonatomic, assign) os_unfair_lock osUnLock;
/// 互斥鎖(遞歸鎖:允許同一個線程對一把鎖進行加鎖;不同線程需要等待)-需要銷毀
@property (nonatomic, assign) pthread_mutex_t mutex;
@property (nonatomic, assign) pthread_cond_t cond;
/// 遞歸鎖-對pthread_mutex_t的封裝
@property (nonatomic, strong) NSRecursiveLock *reLock;
/// 條件鎖-對mutex和cond的封裝
@property (nonatomic, strong) NSCondition *condition;
/// 條件鎖-對NSCondition的封裝(設(shè)置線程依賴)
@property (nonatomic, strong) NSConditionLock *condLock;
/// 讀寫鎖-需要銷毀
@property (nonatomic, assign) pthread_rwlock_t rwLock;
/// 柵欄dispatch_barrier_async
@end
@implementation ViewController
- (void)dealloc {
/// 銷毀鎖
pthread_mutex_destroy(&_mutex);
/// 銷毀條件
pthread_cond_destroy(&_cond);
/// 銷毀讀寫鎖
pthread_rwlock_destroy(&_rwLock);
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_bgView = [[UIView alloc] init];
_bgView.frame = CGRectMake(0, 0, 100, 100);
_bgView.backgroundColor = UIColor.redColor;
[self.view addSubview:_bgView];
self.ossLock = OS_SPINLOCK_INIT;
self.lock = [[NSLock alloc] init];
self.grounp = dispatch_group_create();
self.osUnLock = OS_UNFAIR_LOCK_INIT;
/// 初始化屬性
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_DEFAULT);
//pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);/// 遞歸鎖
/// 初始化鎖
pthread_mutex_init(&_mutex, &attr);
/// 銷毀屬性
pthread_mutexattr_destroy(&attr);
/*
/// 添加條件鎖(不同線程執(zhí)行任務(wù)時需要的控制條件,線程依賴川慌,使用場景:可變數(shù)組刪除和添加元素)
pthread_cond_init(&_cond, NULL);
/// ??以下兩個方法需要放在加鎖解鎖中間執(zhí)行
/// 根據(jù)條件,進入休眠狀態(tài)钳枕,放開當(dāng)前鎖缴渊;被喚醒后會再次對當(dāng)前線程加鎖
pthread_cond_wait(&_cond, &_mutex);
/// 處理完成赏壹,發(fā)送信號喚醒鎖
pthread_cond_signal(&_cond);
/// 處理完成,廣播通知等待該條件的所有線程衔沼,喚醒鎖蝌借,和pthread_cond_signal二選一
pthread_cond_broadcast(&_cond);
/// ??
*/
self.reLock = [[NSRecursiveLock alloc] init];
self.condition = [[NSCondition alloc] init];
self.condLock = [[NSConditionLock alloc] initWithCondition:1];
pthread_rwlock_init(&_rwLock, NULL);
/*
/// 讀鎖
pthread_rwlock_rdlock(&_rwLock);
/// 寫鎖
pthread_rwlock_wrlock(&_rwLock);
/// 讀寫鎖解鎖
pthread_rwlock_unlock(&_rwLock);
*/
self.count = 15;
[self test];
}
- (void)test {
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
for (int i = 0; i < 5; i ++) {
[self doSomething];
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 5; i ++) {
[self doSomething];
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 5; i ++) {
[self doSomething];
}
});
// dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//
// dispatch_group_async(self.grounp, queue, ^{
// for (int i = 0; i < 5; i ++) {
// [self doSomething];
// }
// });
//
// dispatch_group_async(self.grounp, queue, ^{
// for (int i = 0; i < 5; i ++) {
// [self doSomething];
// }
// });
//
// dispatch_group_async(self.grounp, queue, ^{
// for (int i = 0; i < 5; i ++) {
// [self doSomething];
// }
// });
}
- (void)doSomething {
// OSSpinLockLock(&_ossLock);
// [self.lock lock];
// dispatch_group_enter(self.grounp);
// os_unfair_lock_lock(&_osUnLock);
// pthread_mutex_lock(&_mutex);
// [self.reLock lock];
// [self.condition lock];
//// [self.condition wait];
[self.condLock lockWhenCondition:self.condLock.condition];
self.count --;
NSLog(@"當(dāng)前線程:%@ 操作剩余 = %d", [NSThread currentThread], self.count);
[self.condLock unlockWithCondition:self.condLock.condition];
//// [self.condition signal];
//// [self.condition broadcast];
// [self.condition unlock];
// [self.reLock unlock];
// pthread_mutex_unlock(&_mutex);
// os_unfair_lock_unlock(&_osUnLock);
// dispatch_group_leave(self.grounp);
// [self.lock unlock];
// OSSpinLockUnlock(&_ossLock);
}
@end
iOS 各種鎖
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門混巧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勤揩,你說我怎么就攤上這事咧党。” “怎么了陨亡?”我有些...
- 文/不壞的土叔 我叫張陵傍衡,是天一觀的道長。 經(jīng)常有香客問我负蠕,道長蛙埂,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任遮糖,我火速辦了婚禮箱残,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘止吁。我一直安慰自己被辑,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布敬惦。 她就那樣靜靜地躺著盼理,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俄删。 梳的紋絲不亂的頭發(fā)上宏怔,一...
- 文/蒼蘭香墨 我猛地睜開眼帚戳,長吁一口氣:“原來是場噩夢啊……” “哼玷或!你這毒婦竟也來了儡首?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布重归,位于F島的核電站,受9級特大地震影響厦凤,放射性物質(zhì)發(fā)生泄漏鼻吮。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一较鼓、第九天 我趴在偏房一處隱蔽的房頂上張望椎木。 院中可真熱鬧,春花似錦博烂、人聲如沸香椎。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽畜伐。三九已至,卻和暖如春躺率,著一層夾襖步出監(jiān)牢的瞬間玛界,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- (轉(zhuǎn)載) iOS 各種鎖機制 一梧税、前言 前段時間看了幾個開源項目沦疾,發(fā)現(xiàn)他們保持線程同步的方式各不相同,有@syn...
- OSSpinLock OSSpinLock自旋鎖第队,因為自旋鎖一直busy-waiting忙等待占用cpu哮塞,且不會像...
- 鎖可以分為兩大類:自旋鎖(OSSpinLock)和互斥鎖(pthread_mutex)尸执。 相同點:都能保證同一時間...