首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

iOS 中常见的几种锁-代码示例(3)

iOS 中常见的几种锁-代码示例(3)

3. 信号量

    信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量

3.1 dispatch_semaphore_t
实现 GCD 下同步

    - (void)lock7 {
    //    dispatch_semaphore_create //创建一个信号量 semaphore
    //    dispatch_semaphore_signal //发送一个信号 信号量+1
    //    dispatch_semaphore_wait   // 等待信号 信号量-1
        
        /// 需求: 异步线程的两个操作同步执行
        
        dispatch_semaphore_t semaphone = dispatch_semaphore_create(0);
        NSLog(@"start");
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"async .... ");
            sleep(5);
            /// 线程资源 + 1
            dispatch_semaphore_signal(semaphone);//信号量+1
        });
        /// 当前线程资源数量为 0 ,等待激活
        dispatch_semaphore_wait(semaphone, DISPATCH_TIME_FOREVER);
        NSLog(@"end");
    }
    复制代码

3.2 pthread

    - (void)lock8 {
        __block pthread_mutex_t semaphore = PTHREAD_MUTEX_INITIALIZER;
        __block pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
        
        NSLog(@"start");
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            pthread_mutex_lock(&semaphore);
            NSLog(@"async...");
            sleep(5);
            pthread_cond_signal(&cond);
            pthread_mutex_unlock(&semaphore);
        });
        
        pthread_cond_wait(&cond, &semaphore);
        NSLog(@"end");
    }
返回列表