线程同步
来源:互联网 发布:excel中mid函数数组 编辑:程序博客网 时间:2024/06/07 06:05
举例场景
例子:
- 重庆售票窗、上海售票窗都在卖一趟飞机票
- 问题,出现两个售票窗同一时刻卖一张票
- 这肯定是不合理,下面说解决方式
解决方式
线程锁,我们专业点,嗯线程同步
GCD Semaphore (信号量)
示例代码
//"最后一张票,不骗你" __block NSInteger planeTicketCount = 1; // 创建线程锁 信号=1 dispatch_semaphore_t semaphore = hSemaphore(1); while (1) { if (planeTicketCount == 0) break; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ // 信号递减 == 0 就上锁 线程一直在这里等待 ,后面一个参数是等待时间 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); if (planeTicketCount > 0) { // 卖掉了 planeTicketCount --; } // 信号递增 不等0 则唤醒还在等待此信号的线程 dispatch_semaphore_signal(semaphore); }); }
NSLock (锁)
//"最后一张票,不骗你" __block NSInteger planeTicketCount = 1; // 买了一把锁 NSLock *Lock = [[NSLock alloc]init]; while (1) { if (planeTicketCount == 0)break; [[hGCD globalQueue]queueBlock:^{ // 锁上,不让其他线程过去了 [Lock lock]; if (planeTicketCount >0 ) { planeTicketCount --; } // 解锁,其他线程可以进入此代码段了 [Lock unlock]; }]; }
@synchronized (self) 顾名思义同步
//"最后一张票,不骗你" __block NSInteger planeTicketCount = 1; while (1) { if (planeTicketCount == 0)break; [[hGCD globalQueue]queueBlock:^{ // 括起来的这一段代码 同一时间只能有一个线程执行 @synchronized (self) { if (planeTicketCount >0 ) { planeTicketCount --; } //代码端执行完了,自动放锁 } }]; }
0 0
- 线程同步--线程同步--线程同步--线程同步--线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- iOS 基于AsyncSocket的二次开发
- php复习 第十天 图形操作1之文字水印
- 45度斜角地图菱形坐标转换
- C语言格式化xml
- CF
- 线程同步
- 正则验证手机号
- 欢迎使用CSDN-markdown编辑器
- 机器学习算法需要注意的一些问题,算法一些问题
- php复习 第十天 图形操作2之图形水印
- 构建用户画像:5W2H法(二)
- Android 6.0 运行时权限封装框架
- [Oracle] 特定的索引类型
- gsp进行遍历map与list的结合