gpt4 book ai didi

objective-c - dispatch_barrier_async 中的代码未执行

转载 作者:行者123 更新时间:2023-12-03 17:38:03 24 4
gpt4 key购买 nike

我尝试了一个简单的示例来学习使用调度屏障异步。基本上,一个带有 ViewDidLoad 的单 View iOS 应用程序如下。三个任务被提交到并发队列。其中两个读取变量,而第三个写入变量。

我看到写入永远不会被执行(即X = X + 10永远不会被执行。)如果我只是使用dispatch_async提交它(而不是在dispatch_barrier_async中保护它),如最后一段代码所示,它可以工作。 (令人惊讶的是,即使我不使用 disaptch_barrier_async 保护它,在两次读取 X 的同时写入 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。任何指示将不胜感激。

最佳答案

documentation说:

When it encounters a barrier, a concurrent queue delays the execution of the barrier block (or any further blocks) until all blocks submitted before the barrier finish executing.

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

关于objective-c - dispatch_barrier_async 中的代码未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38068402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com