是否有更优雅的方式避免在GCD队列上等待调度?

时间:2015-09-07 14:07:48

标签: ios objective-c multithreading cocoa-touch thread-safety

我有一段代码,我想一次只运行一次。如果它同时运行不止一次,那么它不是世界末日,但是资源很重,而这就是问题所在。我们称之为HEAVY_STUFF。

问题是我的所有任务都依赖于HEAVY_STUFF完成后至少运行一次。最多可以执行2000个任务,并且会在一定程度上发生所有2000个任务在完全相同的时间完成。通常我会使用dispatch_group_notify或类似的,但这意味着HEAVY_STUFF只运行一次就会运行2000次。另外要求1999线程不等待,因为它们占用大量内存 - 例如,如果1999线程处于调度等待状态,那么即使小心{{{{{{{{{ 1}}包装。哎哟。

以下是我现在正在解决的问题。我不确定它是否是线程安全的,但似乎到目前为止工作 - 内存使用率保持在35MB左右,HEAVY_STUFF在每个任务完成后至少运行一次。这是线程安全的吗?什么是更好的GCD解决方案?我不想使用NSOperation *。

autoreleasepool

感谢您的帮助。

1 个答案:

答案 0 :(得分:-1)

这只是运行一次的线程安全:

static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{

        });