gpt4 book ai didi

objective-c - 在应用程序或运行循环之外使用 Grand Central Dispatch

转载 作者:可可西里 更新时间:2023-11-01 03:28:35 25 4
gpt4 key购买 nike

在 GCD 文档中很清楚,要将工作提交到主队列,您需要在 NSApplication(或 UIApplication)中工作或调用 dispatch_main() 以充当某种运行循环。但是,我需要做些什么来设置全局并发队列吗?

基本上我要问的是:如果我编写一个简单的 C 程序,在我使用 dispatch_get_global_queue() 并开始运行之前是否需要执行任何特殊设置?

最佳答案

您不需要调用任何东西来启动调度程序,但您不能退出主线程,否则即使队列中有未完成的工作,您的程序也会退出。您可以使用信号量来防止主线程退出:

int main() {
__block int count = 10;
dispatch_semaphore_t done = dispatch_semaphore_create(0);
dispatch_time_t naptime;

// timeout after 5 seconds
naptime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)5E9);
// no timeout
//naptime = dispatch_time(DISPATCH_TIME_FOREVER, 0);

// schedule some work
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),
^{
dispatch_apply(count, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0),
^(size_t i){
//...
// note: potential race condition on count.
// Synchronization left as an exercise.
if (--count == 0) {
dispatch_semaphore_signal(done);
}
}
);
}
);

if (dispatch_semaphore_wait(done, naptime)) {
// processing didn't complete in allotted time
//...
}
dispatch_release(done);
return 0;
}

代替信号量,有一种概念上更简单但不太实用的方法调用 sleep ,或者在循环中计数到一个巨大的数字(确保编译器不会优化它),或者循环直到一个变量(最初设置为false,处理完成后设置为 true)为 true(称为 busy-wait )。这些中的每一个都有严重的缺陷,并且远不如信号量可取。

您也可以通过创建一个串行队列并对其调用 dispatch_async 几次,然后调用 dispatch_sync,然后退出程序来测试它。

有充分的理由调用 dispatch_main 或启动一个运行循环,但要注意你发送到除主队列之外的任何队列的东西可以在启动到 dispatch_main 的运行循环之前启动。

关于objective-c - 在应用程序或运行循环之外使用 Grand Central Dispatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8366195/

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