首页 > 移动平台 > 详细

iOS 线程同步-信号量 dispatch_semaphore

时间:2020-02-10 21:42:44      阅读:71      评论:0      收藏:0      [点我收藏+]

技术分享图片

#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,assign)  int ticket;
@property (nonatomic, strong) dispatch_semaphore_t semaphore;
@property (nonatomic, strong) dispatch_semaphore_t semaphore1;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.semaphore = dispatch_semaphore_create(1);//最多1个线程同时执行
        self.semaphore1 = dispatch_semaphore_create(5);//最多1个线程同时执行
    self.ticket=50;
//    [self ticketsTest];
    for (int i = 0 ; i<20; i++) {
        [[[NSThread alloc]initWithTarget:self selector:@selector(test2) object:nil] start];
    }
    // Do any additional setup after loading the view.
}
-(void)test2{
    /*
      执行semaphore_wait 如果semaphore1 >0  semaphore1的值就会减一 并继续往下执行
     如果semaphore1 <=0 线程就会休眠 直到 semaphore1的值>0 再将semaphore1的值就会减一 并继续往下执行
     */
    dispatch_semaphore_wait(self.semaphore1, DISPATCH_TIME_FOREVER);
    sleep(2);
    NSLog(@"test");
    //信号量的值加一
    dispatch_semaphore_signal(self.semaphore1);
}
-(void)saleTicket{
    dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
        int ticket = self.ticket;
        sleep(.2);
        ticket--;
        self.ticket=ticket;
        NSLog(@"%d-=%@",self.ticket,[NSThread currentThread]);
    dispatch_semaphore_signal(self.semaphore);
}
-(void)ticketsTest{
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_async(queue, ^{
        for (int i =0; i<5; i++) {
            [self saleTicket];
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i<5; i++) {
            [self saleTicket];
        }
    });
}
@end

 

iOS 线程同步-信号量 dispatch_semaphore

原文:https://www.cnblogs.com/ZhangShengjie/p/12292066.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!