美文网首页
信号量(dispatch_semaphore)

信号量(dispatch_semaphore)

作者: 寂寞先森666 | 来源:发表于2019-07-16 17:41 被阅读0次

在我们平常开发中的一些基本概念与基本使用,dispatch_semaphore俗称信号量,也称为信号锁,在多线程编程中主要用于控制多线程下访问资源的数量,比如系统有两个资源可以使用,但同时有三个线程要访问,所以只能允许两个线程访问,第三个应当等待资源被释放后再访问,这时我们就可以使用dispatch_semaphore

第一、基本用法

#define  ZED_LOCK(lock)  dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);

#define  ZED_UNLOCK(lock)  dispatch_semaphore_signal(lock);

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event

{

//创建共享资源

 self.dict = [NSMutableDictionary dictionary];

 //初始化信号量(信号量为多少、就决定有多少条线程可以同时访问)*

 self.lock = dispatch_semaphore_create(1);

 for(int i =0; i <10; i++) {

        NSLog(@"异步添加任务:%d",i);

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

 *//信号量减1操作*

           ZED_LOCK(self.lock);

            [NSThread sleepForTimeInterval:3];

[**self**.dictsetObject:@"semaphore"forKey:@"key"];

            NSLog(@"i:%d --- thread:%@ --- 共享资源处理完成",i,[NSThread currentThread]);

 //信号量加1操作

            ZED_UNLOCK(self.lock);

        });

    }

}

2019-07-10 16:24:04.624906+0800 信号量[1162:240296] 异步添加任务:0

2019-07-10 16:24:04.625327+0800 信号量[1162:240296] 异步添加任务:1

2019-07-10 16:24:04.625452+0800 信号量[1162:240296] 异步添加任务:2

2019-07-10 16:24:04.625563+0800 信号量[1162:240296] 异步添加任务:3

2019-07-10 16:24:04.625680+0800 信号量[1162:240296] 异步添加任务:4

2019-07-10 16:24:04.625816+0800 信号量[1162:240296] 异步添加任务:5

2019-07-10 16:24:04.625935+0800 信号量[1162:240296] 异步添加任务:6

2019-07-10 16:24:04.626057+0800 信号量[1162:240296] 异步添加任务:7

2019-07-10 16:24:04.626598+0800 信号量[1162:240296] 异步添加任务:8

2019-07-10 16:24:04.627012+0800 信号量[1162:240296] 异步添加任务:9

2019-07-10 16:24:07.626102+0800 信号量[1162:240376] i:0 --- thread:<NSThread: 0x60000314b880>{number = 3, name = (null)} --- 共享资源处理完成

2019-07-10 16:24:10.629048+0800 信号量[1162:247192] i:1 --- thread:<NSThread: 0x60000314df80>{number = 4, name = (null)} --- 共享资源处理完成

2019-07-10 16:24:13.629891+0800 信号量[1162:247193] i:2 --- thread:<NSThread: 0x60000317e700>{number = 5, name = (null)} --- 共享资源处理完成

2019-07-10 16:24:16.630768+0800 信号量[1162:247196] i:3 --- thread:<NSThread: 0x600003141c00>{number = 6, name = (null)} --- 共享资源处理完成

2019-07-10 16:24:19.634851+0800 信号量[1162:247197] i:4 --- thread:<NSThread: 0x600003141bc0>{number = 7, name = (null)} --- 共享资源处理完成

2019-07-10 16:24:22.639558+0800 信号量[1162:247198] i:5 --- thread:<NSThread: 0x60000314e040>{number = 8, name = (null)} --- 共享资源处理完成

2019-07-10 16:24:25.645110+0800 信号量[1162:247199] i:6 --- thread:<NSThread: 0x60000314b880>{number = 9, name = (null)} --- 共享资源处理完成

2019-07-10 16:24:28.650299+0800 信号量[1162:247200] i:7 --- thread:<NSThread: 0x60000314bac0>{number = 10, name = (null)} --- 共享资源处理完成

2019-07-10 16:24:31.655295+0800 信号量[1162:247201] i:8 --- thread:<NSThread: 0x60000314e540>{number = 11, name = (null)} --- 共享资源处理完成

2019-07-10 16:24:34.655921+0800 信号量[1162:247202] i:9 --- thread:<NSThread: 0x60000314e180>{number = 12, name = (null)} --- 共享资源处理完成

第二、信号量奔溃案例

image

崩溃

image

崩溃

image

不崩溃

参考资料:https://www.cnblogs.com/yajunLi/p/6274282.html

参考资料:https://www.jianshu.com/p/7981e3357fe9

相关文章

网友评论

      本文标题:信号量(dispatch_semaphore)

      本文链接:https://www.haomeiwen.com/subject/zqotlctx.html