递归锁+条件锁+互斥锁-04-多线程

  1 //
  2 //  ViewController.m
  3 //  05-递归锁(recursive)+条件锁(condition)
  4 //
  5 //  Created by mac on 16/4/20.
  6 //  Copyright © 2016年 mac. All rights reserved.
  7 //
  8 /*
  9
 10  3). 互斥锁
 11  NSLock *_lock;
 12
 13 3)NSLock :不能多次调用,会产生死锁
 14
 15  2016-04-20 16:06:44.600 05-递归锁(recursive)+条件锁(condition)[17107:4573400] *** -[NSLock lock]: deadlock (<NSLock: 0x7feceb542400> ‘(null)‘)
 16  2016-04-20 16:06:44.601 05-递归锁(recursive)+条件锁(condition)[17107:4573400] *** Break on _NSLockError() to debug.
 17
 18  1)NSRecursiveLock:可以多次调用,在递归函数中调用
 19  对于递归锁:每次成功的lock都必须平衡调用unlock操作,只有所有的加锁和解锁都平衡时,锁才能真正的释放给其它线程所获得。
 20
 21  2)NSConditionLock:
 22  保证加锁在condition1方法的unlockWithCondition之后进行
 23  lockWhenConditon会阻止线程往下执行,直到条件为上一次解锁时设置的条件时才能继续往下执行。
 24  条件锁可用于有特定顺序的处理流程中。
 25 */
 26
 27 #import "ViewController.h"
 28
 29 @interface ViewController ()
 30
 31 @end
 32
 33 @implementation ViewController {
 34
 35     //1). 递归锁
 36     NSRecursiveLock *_recursiveLock;
 37
 38     //2). 条件锁
 39     NSConditionLock *_conditionLock;
 40
 41     //3). 互斥锁
 42     NSLock *_lock;
 43 }
 44
 45 - (void)viewDidLoad {
 46     [super viewDidLoad];
 47
 48 //    [self recursiveLock]; //递归锁
 49     [self conditionLock]; //条件锁
 50 }
 51
 52 /**
 53  *  1. 递归锁应用
 54  */
 55 - (void)recursiveLock {
 56     //普通lock
 57     _lock = [[NSLock alloc] init];
 58
 59     _recursiveLock = [[NSRecursiveLock alloc] init];
 60
 61     [NSThread detachNewThreadSelector:@selector(recursiveAction:) toTarget:self withObject:@5];
 62 }
 63 - (void)recursiveAction:(NSNumber *)value {
 64
 65     NSInteger currentValue = [value integerValue];
 66
 67     NSInteger result = [self factorialMethod:currentValue];
 68
 69     NSLog(@"%li", result);
 70 }
 71 - (NSInteger)factorialMethod:(NSInteger)value {
 72
 73     [_recursiveLock lock];
 74     //[_lock lock];
 75
 76     //1. 递归的出口
 77     if (value == 0) {
 78
 79         [_recursiveLock unlock];//第2种情况下解锁
 80         //[_lock unlock];
 81
 82         return 1;
 83     }
 84
 85     [_recursiveLock unlock]; //第1种情况下解锁
 86     //2. 常规表达式
 87     return value * [self factorialMethod:value - 1];
 88
 89 }
 90
 91 /**
 92  *  2. 条件锁应用
 93  */
 94 - (void)conditionLock {
 95
 96     _conditionLock = [[NSConditionLock alloc] init];
 97
 98     [NSThread detachNewThreadSelector:@selector(conditionAction) toTarget:self withObject:nil];
 99
100     [NSThread detachNewThreadSelector:@selector(conditionLockAction) toTarget:self withObject:@10];
101 }
102 - (void)conditionAction {
103
104     [_conditionLock lock];
105
106     NSLog(@"_conditionLock");
107
108     [NSThread sleepForTimeInterval:1];
109
110     //解锁,并且设置下次加锁条件 tag==10
111     [_conditionLock unlockWithCondition:10];
112 }
113
114 - (void)conditionLockAction {
115
116     //保证加锁在condition1方法的unlockWithCondition之后进行
117     [NSThread sleepForTimeInterval:2];
118
119     //lockWhenCondition会阻止线程往下执行,直到条件为上一次解锁时设置的调件时才能继续往下执行:条件锁可用于特定顺序的处理流程中。
120     [_conditionLock lockWhenCondition:10];
121
122     NSLog(@"conditionLockAction");
123
124     [_conditionLock unlock];
125 }
126
127 @end
时间: 2024-08-28 17:23:54

递归锁+条件锁+互斥锁-04-多线程的相关文章

Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为"独占锁". 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有:而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取.ReentrantLock分为"公平锁"和"非公平锁".它们的区别体现在获取锁的机制上是否公平."锁"是为了保护竞争资源,防止多个线程同时操作线程而出错,ReentrantLock在

GIL锁与自定义互斥锁

Gil锁保证内存管理数据安全,不能保证所有数据的安全,不同的数据要加不同的锁 from threading import Thread,Lock import time mutex=Lock() n=100 def task(): global n temp=n time.sleep(0.1) n=temp-1 if __name__ == '__main__': l=[] for i in range(100): t=Thread(target=task) l.append(t) t.star

笔记3 linux 多线程 条件变量+互斥锁

//cond lock #include<stdio.h> #include<unistd.h> #include<pthread.h> struct test { char a[10]; char b[10]; char c[10]; }yb = {"111","222","33333"}; static int j=0; pthread_mutex_t mutex_1 = PTHREAD_MUTEX_INI

[Todo] 乐观悲观锁,自旋互斥锁等等

乐观锁.悲观锁.要实践 http://chenzhou123520.iteye.com/blog/1860954 http://chenzhou123520.iteye.com/blog/1863407 http://outofmemory.cn/sql/optimistic-lock-and-pessimistic-lock 自旋锁 http://www.cnblogs.com/hdflzh/p/3716156.html http://blog.csdn.net/pi9nc/article/d

条件变量、信号量、互斥锁

转载 http://blog.csdn.net/yusiguyuan/article/details/14161225 线程间的同步技术,主要以互斥锁和条件变量为主,条件变量和互斥所的配合使用可以很好的处理对于条件等待的线程间的同步问题.举个例子:当有两个变量x,y需要在多线程间同步并且学要根据他们之间的大小比较来启动不同的线程执行顺序,这便用到了条件变量这一技术.看代码 1 #include <iostream> 2 #include <pthread.h> 3 using na

【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)

上篇文章也蛮好,线程同步之条件变量与互斥锁的结合: http://www.cnblogs.com/charlesblc/p/6143397.html 现在有这篇文章: http://blog.csdn.net/goodluckwhh/article/details/8564319 POSIX定义了一系列同步对象用于同步和互斥.同步对象是内存中的变量属于进程中的资源,可以按照与访问数据完全相同的方式对其进行访问.默认情况下POSIX定义的这些同步对象具有进程可见性,即同步对象只对定义它的进程可见:

Python进阶(3)_进程与线程中的lock(互斥锁、递归锁、信号量)

1.同步锁 (Lock) 当各个线程需要访问一个公共资源时,会出现数据紊乱 例如: 1 import threading,time 2 def sub(): 3 global num #对全局变量进行操作 4 5 temp=num 6 time.sleep(0.001) #模拟线程执行中出现I/o延迟等 7 num=temp-1 #所有线程对全局变量进行减一 8 9 time.sleep(1) 10 11 num=100 12 l=[] 13 14 for i in range(100): 15

Unix IPC之互斥锁与条件变量

互斥锁 1.函数声明 #include <pthread.h> /* Mutex handling. */ /* Initialize a mutex. */ extern int pthread_mutex_init (pthread_mutex_t *__mutex, __const pthread_mutexattr_t *__mutexattr) __THROW __nonnull ((1)); /* Destroy a mutex. */ extern int pthread_mut

linux 线程的同步 二 (互斥锁和条件变量)

互斥锁和条件变量 为了允许在线程或进程之间共享数据,同步时必须的,互斥锁和条件变量是同步的基本组成部分. 1.互斥锁 互斥锁是用来保护临界区资源,实际上保护的是临界区中被操纵的数据,互斥锁通常用于保护由多个线程或多进程分享的共享数据.一般是一些可供线程间使用的全局变量,来达到线程同步的目的,即保证任何时刻只有一个线程或进程在执行其中的代码.一般加锁的轮廓如下: pthread_mutex_lock() 临界区 pthread_mutex_unlock() 互斥锁API pthread_mutex

linux 互斥锁

在多线程控制中,可以通过互斥锁,实现多个线程对共享资源的单独访问.在同一时刻,只有一个线程能够掌握互斥锁,只有这个线程能够对共享资源进行访问,其他线程被阻塞,直到互斥锁被释放. 如果,互斥锁上锁期间,有多个线程阻塞,那么所有被阻塞的线程会被设置为可执行状态.第一个执行的线程,取得互斥锁的控制权,上锁.其他线程继续阻塞. 一  创建互斥锁 互斥锁可以被静态创建或动态创建.   静态创建: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;  特别说