zoukankan      html  css  js  c++  java
  • 信号量与并发控制

    代码1 - 未使用信号量控制并发:

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            for (NSUInteger i = 0;  i < 10; ++i) {
                NSLog(@"Task - 1");
            }
        });
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            for (NSUInteger i = 0;  i < 10; ++i) {
                NSLog(@"Task - 2");
            }
        });
    }
    
    @end

    输出:

    Task - 1
    Task - 2
    Task - 1
    Task - 2
    Task - 1
    Task - 2
    Task - 1
    Task - 2
    Task - 1
    Task - 2
    Task - 1
    Task - 2
    Task - 1
    Task - 2
    Task - 1
    Task - 2
    Task - 1
    Task - 2
    Task - 1
    Task - 2

    代码 - 使用信号量控制并发:

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @property (nonatomic, strong) dispatch_semaphore_t semaphore;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.semaphore = dispatch_semaphore_create(1);
    
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
            for (NSUInteger i = 0;  i < 10; ++i) {
                NSLog(@"Task - 1");
            }
            dispatch_semaphore_signal(self.semaphore);
        });
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
            for (NSUInteger i = 0;  i < 10; ++i) {
                NSLog(@"Task - 2");
            }
            dispatch_semaphore_signal(self.semaphore);
        });
    }
    
    @end

    输出:

    Task - 1
    Task - 1
    Task - 1
    Task - 1
    Task - 1
    Task - 1
    Task - 1
    Task - 1
    Task - 1
    Task - 1
    Task - 2
    Task - 2
    Task - 2
    Task - 2
    Task - 2
    Task - 2
    Task - 2
    Task - 2
    Task - 2
    Task - 2
  • 相关阅读:
    [daily][dpdk] 内核模块(网卡驱动)无法卸载
    [development][tcp/ip][ids] 一个简单有参考价值的库 libnids
    [development][http][libhtp] suricata的http库--libhtp
    [skill][http] http管道化连接
    [skill][telnet] 用telnet获取一个网页
    [daily][grub2] grub2修改内核选项
    [knowledge] big data things
    [knowledge][dpdk] open data plane
    [daily] docker
    [knowledge] 停止等待协议
  • 原文地址:https://www.cnblogs.com/xwoder/p/7460783.html
Copyright © 2011-2022 走看看