pthread mutexlock

在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。

1. 互斥锁属性

1. 类型

参考:https://linux.die.net/man/3/pthread_mutexattr_settype

  1. PTHREAD_MUTEX_DEFAULT: 尝试以递归方式锁定该互斥锁将产生不确定的行为。对于不是由调用线程锁定的互斥锁,如果尝试解除对它的锁定,则会产生不确定的行为。如果尝试解除锁定尚未锁定的互斥锁,则会产生不确定的行为。

  2. PTHREAD_MUTEX_NORMAL: 不提供死锁检测。尝试重新锁定互斥锁会导致死锁。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或未锁定,则将产生不确定的行为。

  3. PTHREAD_MUTEX_ERRORCHECK: 会提供错误检查。如果某个线程尝试重新锁定的互斥锁已经由该线程锁定,则将返回错误。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或者未锁定,则将返回错误。

  4. PTHREAD_MUTEX_RECURSIVE: 该互斥锁会保留锁定计数这一概念。线程首次成功获取互斥锁时,锁定计数会设置为1。线程每重新锁定该互斥锁一次,锁定计数就增加 1。线程每解除锁定该互斥锁一次,锁定计数就减小1。 锁定计数达到 0 时,该互斥锁即可供其他线程获取。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或者未锁定,则将返回错误。

Note:在iOS系统中,PTHREAD_MUTEX_DEFAULT等于PTHREAD_MUTEX_NORMAL;

/*
 * Mutex type attributes
 */
#define PTHREAD_MUTEX_NORMAL        0
#define PTHREAD_MUTEX_ERRORCHECK    1
#define PTHREAD_MUTEX_RECURSIVE     2
#define PTHREAD_MUTEX_DEFAULT       PTHREAD_MUTEX_NORMAL

2. 协议

参考:https://linux.die.net/man/3/pthread_mutexattr_setprotocol

When a thread owns a mutex with the PTHREAD_PRIO_NONE protocol attribute, its priority and scheduling shall not be affected by its mutex ownership.

  1. PTHREAD_PRIO_NONE: 当线程拥有这种协议的互斥锁时,该线程的优先级和调度将不受到互斥锁拥有权的影响。

When a thread is blocking higher priority threads because of owning one or more mutexes with the PTHREAD_PRIO_INHERIT protocol attribute, it shall execute at the higher of its priority or the priority of the highest priority thread waiting on any of the mutexes owned by this thread and initialized with this protocol.

  1. PTHREAD_PRIO_INHERIT: 当拥有一个或多个这种协议属性的互斥锁的线程阻塞更高优先级的线程时,那么该线程将以高于自身或者被该线程所拥有的互斥锁所阻塞线程中最高优先级的线程优先级的运行。

When a thread owns one or more mutexes initialized with the PTHREAD_PRIO_PROTECT protocol, it shall execute at the higher of its priority or the highest of the priority ceilings of all the mutexes owned by this thread and initialized with this attribute, regardless of whether other threads are blocked on any of these mutexes or not.

  1. PTHREAD_PRIO_PROTECT: 当一个线程拥有这种协议属性的互斥锁时,该线程将以高于其本身优先级或者当前所拥有锁中最高的优先级运行,无论有没有线程被当前所拥有的锁阻塞。
/*
 * Mutex protocol attributes
 */
#define PTHREAD_PRIO_NONE            0
#define PTHREAD_PRIO_INHERIT         1
#define PTHREAD_PRIO_PROTECT         2

3. 共享

参考:https://linux.die.net/man/3/pthread_mutexattr_setpshared

iOS只能用PTHREAD_SCOPE_SYSTEM

/* We only support PTHREAD_SCOPE_SYSTEM */
#define PTHREAD_SCOPE_SYSTEM         1
#define PTHREAD_SCOPE_PROCESS        2

#define PTHREAD_PROCESS_SHARED         1
#define PTHREAD_PROCESS_PRIVATE        2

4. 策略

pthread_mutexattr_setpolicy_np

/*
 * Mutex attributes
 */
#define _PTHREAD_MUTEX_POLICY_NONE      0
#define _PTHREAD_MUTEX_POLICY_FAIRSHARE     1
#define _PTHREAD_MUTEX_POLICY_FIRSTFIT      2

5. 优先级上限

参考:https://linux.die.net/man/3/pthread_mutexattr_setprioceiling

pthread_mutexattr_setprioceiling

使用

    __block NSString *str = @"aa";
    NSLog(@"str: %@", str);
    pthread_mutex_init(&mutexLock, NULL);
    dispatch_queue_t myQueue = dispatch_queue_create("com.investment.concurrent", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(myQueue, ^{
        pthread_mutex_lock(&mutexLock);
        NSLog(@"op1 locked");
        NSLog(@"op1 changing str value euqal to 5");
        sleep(5);
        str = @"bb";
        pthread_mutex_unlock(&mutexLock);
        NSLog(@"op1 execute finished");
        NSLog(@"op1 unlocked");
    });
    dispatch_async(myQueue, ^{
        pthread_mutex_lock(&mutexLock);
        NSLog(@"op2 locked");
        NSLog(@"str: %@", str);
        pthread_mutex_unlock(&mutexLock);
        NSLog(@"op2 unlocked");
    });
    
2017-09-22 18:49:18.133706 iOSLockDemo[15551:4465227] str: aa
2017-09-22 18:49:18.134384 iOSLockDemo[15551:4465317] op1 locked
2017-09-22 18:49:18.134448 iOSLockDemo[15551:4465317] op1 changing str value euqal to 5
2017-09-22 18:49:23.139684 iOSLockDemo[15551:4465317] op1 execute finished
2017-09-22 18:49:23.139768 iOSLockDemo[15551:4465317] op1 unlocked
2017-09-22 18:49:23.139797 iOSLockDemo[15551:4465314] op2 locked
2017-09-22 18:49:23.139880 iOSLockDemo[15551:4465314] str: bb
2017-09-22 18:49:23.139954 iOSLockDemo[15551:4465314] op2 unlocked

参考

https://baike.baidu.com/item/互斥锁/841823?fr=aladdin

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容