iOS 各種鎖

#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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昔瞧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子菩佑,更是在濱河造成了極大的恐慌自晰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稍坯,死亡現(xiàn)場離奇詭異酬荞,居然都是意外死亡,警方通過查閱死者的電腦和手機瞧哟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門混巧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勤揩,你說我怎么就攤上這事咧党。” “怎么了陨亡?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵傍衡,是天一觀的道長。 經(jīng)常有香客問我负蠕,道長蛙埂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任遮糖,我火速辦了婚禮箱残,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘止吁。我一直安慰自己被辑,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布敬惦。 她就那樣靜靜地躺著盼理,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俄删。 梳的紋絲不亂的頭發(fā)上宏怔,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音畴椰,去河邊找鬼臊诊。 笑死,一個胖子當(dāng)著我的面吹牛斜脂,可吹牛的內(nèi)容都是我干的抓艳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼帚戳,長吁一口氣:“原來是場噩夢啊……” “哼玷或!你這毒婦竟也來了儡首?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤偏友,失蹤者是張志新(化名)和其女友劉穎蔬胯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體位他,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡氛濒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹅髓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泼橘。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖迈勋,靈堂內(nèi)的尸體忽然破棺而出炬灭,到底是詐尸還是另有隱情,我是刑警寧澤靡菇,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布重归,位于F島的核電站,受9級特大地震影響厦凤,放射性物質(zhì)發(fā)生泄漏鼻吮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一较鼓、第九天 我趴在偏房一處隱蔽的房頂上張望椎木。 院中可真熱鬧,春花似錦博烂、人聲如沸香椎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畜伐。三九已至,卻和暖如春躺率,著一層夾襖步出監(jiān)牢的瞬間玛界,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工悼吱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慎框,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓后添,卻偏偏與公主長得像笨枯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本文主要是一個對各種鎖的簡單整理猎醇,方便后續(xù)查看回顧,畢竟鎖在實際項目中用的比較少努溃,再牛逼的知識點硫嘶,老不用也記不住。...
    只敲代碼不偷桃閱讀 762評論 0 1
  • (轉(zhuǎn)載) iOS 各種鎖機制 一梧税、前言 前段時間看了幾個開源項目沦疾,發(fā)現(xiàn)他們保持線程同步的方式各不相同,有@syn...
    北漂老張閱讀 445評論 0 1
  • OSSpinLock OSSpinLock自旋鎖第队,因為自旋鎖一直busy-waiting忙等待占用cpu哮塞,且不會像...
    FengyunSky閱讀 1,564評論 0 2
  • 概述 iOS多線程開發(fā),會出現(xiàn)數(shù)據(jù)競爭凳谦,因此需要鎖來保證線程安全忆畅。 線程安全 當(dāng)一個線程訪問資源時,需要保證其它的...
    NapoleonY閱讀 595評論 0 7
  • 鎖可以分為兩大類:自旋鎖(OSSpinLock)和互斥鎖(pthread_mutex)尸执。 相同點:都能保證同一時間...
    13d8cd576232閱讀 359評論 0 2