gpt4 book ai didi

ios - 同步块(synchronized block)和 dispatch_async

转载 作者:技术小花猫 更新时间:2023-10-29 10:48:47 24 4
gpt4 key购买 nike

当我们在 block 中调用 dispatch_async() 时,使用 @synchronized() 的 IOS 中的锁会发生什么。

例如:

    id myID
-(void) foobar
{
@synchronized(myID){
dispatch_async(){ //do stuff with myID};
}
}

锁在 dispatch_async 调用中是否仍然有效?或者更重要的是,在 dispatch_async() 中使用另一个 @synchronized() 调用有什么缺点吗?

最佳答案

假设您正在尝试同步与后台队列中的此 myID 对象的交互,您希望它以相反的方式进行,即调度 block 内的锁。现在你有:

@synchronized(myID) {
dispatch_async(queue, ^{
// do stuff with myID
});
}

这是同步将分派(dispatch)的 block 添加到您的队列的过程,但同步您在后台所做的事情。我怀疑那不是你的意思。

你可能打算:

dispatch_async(queue, ^{
@synchronized(myID) {
// do stuff with myID
}
});

它看起来非常相似,但会导致完全不同的行为。现在,正在同步调度到后台队列的工作。

作为进一步的改进,如果这个分派(dispatch)的 block 可能很慢(我假设它可能是),那么您可能希望尽可能地限制 @synchronized block :

dispatch_async(queue, ^{

// do slow stuff in preparation for interacting with `myID`

@synchronized(myID) {
// quickly do stuff with myID
}

// do anything else here
});

如果您在 @synchronized block 中执行所有后台 block ,您可能会破坏将其分派(dispatch)到后台的全部目的,即尽量减少对主队列的影响。最后一个再现减轻了这个问题。

作为最后的观察,如果你有一个串行队列(或一个非全局并发队列,你在其中使用屏障进行更新),这通常被用作一种完全不需要锁的技术,只要所有myID 的更新和查询被分派(dispatch)到该队列。参见 Eliminating Lock-Based Code并发编程指南中。

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

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