
Semaphore回顾
发布日期:2021-05-08 23:24:42
浏览次数:15
分类:博客文章
本文共 2392 字,大约阅读时间需要 7 分钟。
用途
在多线程访问可变变量时,是非线程安全的。可能导致程序崩溃。此时,可以通过使用信号量(semaphore)技术,保证多线程处理某段代码时,后面线程等待前面线程执行,保证了多线程的安全性。使用方法记两个就行了,一个是wait(dispatch_semaphore_wait),一个是signal(dispatch_semaphore_signal)。根据dispatch_semaphore_wait的参数类型提示去创建信号量(dispatch_semaphore_t)即可。
感觉原理跟PV操作如出一辙。不用semaphore时code:
#importint main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); NSMutableArray *lArrM = [NSMutableArray array]; for (int i = 0; i < 100; ++i) { dispatch_async(dispatch_get_global_queue(0, 0), ^{ [lArrM addObject:@(i)]; }); } } return 0;}
运行结果
SemephoreTest[3665:130800] Hello, World!SemephoreTest(3665,0x700001daa000) malloc: *** error for object 0x10077b2e0: pointer being freed was not allocatedSemephoreTest(3665,0x700001daa000) malloc: *** set a breakpoint in malloc_error_break to debugSemephoreTest(3665,0x700001e2d000) malloc: *** error for object 0x102b00340: pointer being freed was not allocatedSemephoreTest(3665,0x700001e2d000) malloc: *** set a breakpoint in malloc_error_break to debugSemephoreTest[3665:130800] lArrM.count:0(lldb)
用semaphore时code:
//// ViewController.m// SemophoreTest//// Created by LongMa on 2019/8/22.// Copyright © 2019 . All rights reserved.//#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *lArrM = [NSMutableArray array]; dispatch_semaphore_t lSema = dispatch_semaphore_create(1);//参数1,代表只能有1个线程同时访问被限制的代码。 for (int i = 0; i < 1000; ++i) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_semaphore_wait(lSema, DISPATCH_TIME_FOREVER);//wait使信号量的值-1,如果结果为0,其他线程来访问时,需要等待。直到信号量的值大于0 [lArrM addObject:@(i)]; NSLog(@"lArrM.count:%zd",lArrM.count); dispatch_semaphore_signal(lSema);///wait使信号量的值+1,必须和dispatch_semaphore_wait配对使用。 }); } dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"final delayed lArrM.count:%zd",lArrM.count); });}@end
运行结果(用commandlineTool运行代码时,log存在不完整问题):
... SemophoreTest[9092:877715] lArrM.count:999 SemophoreTest[9092:877730] lArrM.count:1000 SemophoreTest[9092:877696] final delayed lArrM.count:1000
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月08日 17时52分19秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
淘宝WAP版小BUG分析
2021-05-09
asp.net打印网页后自动关闭网页【无需插件】
2021-05-09
【Maven】POM基本概念
2021-05-09
【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
2021-05-09
【设计模式】单例模式
2021-05-09
远程触发Jenkins的Pipeline任务的并发问题处理
2021-05-09
entity framework core在独立类库下执行迁移操作
2021-05-09
Asp.Net Core 2.1+的视图缓存(响应缓存)
2021-05-09
【wp】HWS计划2021硬件安全冬令营线上选拔赛
2021-05-09
Ef+T4模板实现代码快速生成器
2021-05-09
JQuery选择器
2021-05-09
多线程之volatile关键字
2021-05-09
2.2.2原码补码移码的作用
2021-05-09
Java面试题:Servlet是线程安全的吗?
2021-05-09
Java集合总结系列2:Collection接口
2021-05-09
Linux学习总结(九)—— CentOS常用软件安装:中文输入法、Chrome
2021-05-09
比技术还重要的事
2021-05-09
linux线程调度策略
2021-05-09
软中断和实时性
2021-05-09
Linux探测工具BCC(可观测性)
2021-05-09