我尝试了一个简单的例子来学习使用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。任何指针都将非常感激。
答案 0 :(得分:2)
当遇到屏障时,并发队列会延迟屏障块(或任何其他块)的执行,直到屏障完成执行之前提交的所有块为止。
您提交了两个永远不会完成执行的块,然后提交了障碍块。所以GCD永远不会执行屏障块。