gpt4 book ai didi

ios - 串行调度队列如何保证资源保护?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:29 24 4
gpt4 key购买 nike

//my_serial_queue is a serial_dispatch_queue

dispatch_async(my_serial_queue, ^{

//access a shared resource such as a bank account balance
[self changeBankAccountBalance];

});

如果我提交 100 个任务,每个任务访问和改变银行账户余额,我知道串行队列将按顺序执行每个任务,但是使用 dispatch_async 时这些任务是否也按顺序完成?

如果我异步提交到串行队列的任务 #23 需要很长时间才能完成怎么办?任务#24 是仅在任务#23 完成后才开始,还是任务#24 在任务#23 完成之前开始?如果是这样,任务#24 在开始工作时会不会有错误的银行账户余额,从而破坏数据完整性?

谢谢!!

最佳答案

是的,专用的串行队列是同步访问在多个线程之间共享的某些资源的好方法。而且,是的,对于串行队列,每个任务都将等待前一个任务完成。

两个观察:

  1. 虽然这听起来像是一个非常低效的过程,但这无疑是任何同步技术(无论是基于队列还是基于锁的方法)的核心,其目标是最大限度地减少共享资源的并发更新。

    但在许多情况下,串行队列技术可以产生比其他常见技术(例如简单的互斥锁、NSLock@synchronized 指令)明显更好的性能。有关替代同步技术的讨论,请参阅 Synchronization 线程编程指南的部分。有关使用队列代替锁的讨论,请参阅 Eliminating Lock-Based Code并发编程指南的远离线程部分。

  2. 串行队列模式的一种变体是使用“读写器”模式,您可以在其中创建 GCD 并发队列:

    queue = dispatch_queue_create("identifier", DISPATCH_QUEUE_CONCURRENT);

    然后您使用 dispatch_sync 执行读取,但您使用 dispatch_barrier_async 执行写入。净有效是允许并发读取操作,但确保绝不会同时执行写入操作。

    如果您的资源允许并发读取,那么读写器模式可以提供比串行队列更高的性能增益。

因此,简而言之,虽然让任务 #24 等待任务 #23 似乎效率低下,但这是任何同步技术所固有的,您努力将共享资源的并发更新降至最低。而 GCD 串行队列是一种非常高效的机制,通常比许多简单的锁定机制都要好。在某些情况下,读写器模式可以提供更进一步的性能改进。


我在下面的原始回答是对标题为“串行调度队列如何保证并发性?”的令人困惑的原始问题的回应。现在回想起来,这只是一次不小心用错了术语。


这是一个有趣的用词,“串行调度队列如何保证并发性?”

three types of queues 、串行、并发和主队列。顾名思义,串行队列将不会启动下一个分派(dispatch) block ,直到前一个分派(dispatch) block 完成。 (使用您的示例,这意味着如果任务 23 需要很长时间,则在完成之前不会启动任务 24。)有时这很关键(例如,如果任务 24 取决于任务 23 的结果,或者如果任务 23和 24 个正在尝试访问相同的共享资源)。

如果您希望这些不同的分派(dispatch)任务相互并发运行,您可以使用并发队列(通过 dispatch_get_global_queue 获得的全局并发队列之一,或者您可以创建自己的使用带有 DISPATCH_QUEUE_CONCURRENT 选项的 dispatch_queue_create 自己的并发队列)。在并发队列中,许多已分派(dispatch)的任务可能会同时运行。使用并发队列需要小心(特别是共享资源的 synchronization),但如果实现得当,可以产生显着的性能优势。

作为这两种方法的折衷方案,您可以使用操作队列,它们都可以是并发的,但您还可以通过设置 maxConcurrentOperationCount。您将使用它的典型场景是在执行后台网络任务时,您不希望超过五个并发网络请求。

有关详细信息,请参阅 Concurrency Programming Guide .

关于ios - 串行调度队列如何保证资源保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19010732/

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