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
  • 相关阅读:
    [转载]MATLAB 图像处理命令
    html Window与document区别(轉)
    ICMP数据包结构(转)
    CString,string,char*之间的转换(转)
    word或dword区别
    VS2010 皮肤扩展
    Unicode _T和L和_TXET
    转:git 的常用命令
    git fetch 和 git pull 的区别
    mac git 命令自动补全
  • 原文地址:https://www.cnblogs.com/xwoder/p/7460783.html
Copyright © 2011-2022 走看看