iOS 线程同步-信号量 dispatch_semaphore

复制代码
#define kSemaphoreBegin \
static dispatch_semaphore_t semaphore; \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
    semaphore = dispatch_semaphore_create(1); \
}); \
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

#define kSemaphoreEnd \
dispatch_semaphore_signal(semaphore);
#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{
//    static dispatch_semaphore_t semaphore;
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
//        semaphore=dispatch_semaphore_create(1);
//    });
//    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//    dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
    kSemaphoreBegin
        int ticket = self.ticket;
        sleep(.2);
        ticket--;
        self.ticket=ticket;
        NSLog(@"%d-=%@",self.ticket,[NSThread currentThread]);
    kSemaphoreEnd
//    dispatch_semaphore_signal(semaphore);
//    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
复制代码

 

posted @   ZhangShengjie  阅读(896)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示