dispatch_barrier_async中的代码未执行

时间:2016-06-28 06:18:03

标签: objective-c cocoa cocoa-touch grand-central-dispatch

我尝试了一个简单的例子来学习使用dispatch-barrier异步。基本上,ViewDidLoad的单视图iOS应用程序如下所示。将三个任务提交到并发队列。其中两个读取变量,而第三个写入变量。

我看到写入永远不会被执行(即X = X + 10永远不会被执行。)如果我只是使用dispatch_async提交它(而不是在dispatch_barrier_async中保护它,如最后一个代码所示),它可以工作。 (令人惊讶的是,即使我没有使用disaptch_barrier_async保护它,也不会在X读取2次的同时写入X.

  - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
dispatch_queue_t backgroundQueue;

__block int X = 10;

backgroundQueue = dispatch_queue_create("com.smarthome.readwriteQ", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(backgroundQueue, ^{
    while (1) {
        NSLog(@"Task 1: X = %d",X);
        [NSThread sleepForTimeInterval:4];
    }
});

dispatch_async(backgroundQueue, ^{
    while (1) {
        NSLog(@"Task 2: X = %d",X);
        [NSThread sleepForTimeInterval:4];
    }
});

//This does not work
dispatch_barrier_async(backgroundQueue,^(void){
    while (1) {
        X = X + 10;
        NSLog(@"Task 3: After Writing X = %d",X);
        [NSThread sleepForTimeInterval:2];
    }
 });

 //This works
 dispatch_async(backgroundQueue,^(void){
    while (1) {
        X = X + 10;
        NSLog(@"Task 3: After Writing X = %d",X);
        [NSThread sleepForTimeInterval:2];
    }
 });
}

我想我还没有正确理解dispatch_barrier_async。任何指针都将非常感激。

1 个答案:

答案 0 :(得分:2)

documentation说:

  

当遇到屏障时,并发队列会延迟屏障块(或任何其他块)的执行,直到屏障完成执行之前提交的所有块为止。

您提交了两个永远不会完成执行的块,然后提交了障碍块。所以GCD永远不会执行屏障块。