gpt4 book ai didi

ios - dispatch_async 中的同步块(synchronized block)

转载 作者:行者123 更新时间:2023-12-01 17:55:09 26 4
gpt4 key购买 nike

我已经看到将异步调度到主队列或私有(private)调度队列(串行)的代码,然后在调度代码块中是@synchronized。你想在什么情况下这样做?串行队列不是已经提供了所需的同步吗?

可以用另一个 GCD 调度替换同步块(synchronized block)吗?

最佳答案

@synchronized()确保包含的代码(对于给定的标记作为 @synchronized 的参数)一次只在一个线程上运行。

提交到串行队列的 block 一次执行一个,即。在完成执行之前提交的所有 block 之前,不会执行给定 block 。只要仅从串行队列上运行的代码访问共享资源,就无需同步/锁定对它的访问。然而,仅仅因为给定的队列是串行的,并不意味着其他队列/线程(甚至串行队列!)不会同时运行并访问相同的共享资源。

使用 @synchronized()是防止这些多个线程/队列同时访问资源的一种方法。请注意,所有访问共享资源的代码都需要用 @synchronized() 包装。 .

是的,您可以使用另一个 GCD 调度来代替同步块(synchronized block)。这样做的“GCD 方式”是使用串行队列序列化对共享资源的所有访问。因此,任何时候需要访问共享资源时,您都可以将该代码(根据用例使用 dispatch_sync()dispatch_async())分派(dispatch)到与资源关联的串行队列。当然,这意味着资源访问队列必须对访问共享资源的程序的所有部分都是可见/可访问的。 (与 @synchronized() 本质上存在相同的问题,因为它的锁定 token 必须可以在任何需要使用的地方访问,但它更容易一些,因为它可以只是一个字符串常量。)

关于ios - dispatch_async 中的同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19322127/

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