gpt4 book ai didi

ios - 这个 GCD 实现的 getter setter 线程安全并且比@synchronized 工作得更好吗?对象

转载 作者:可可西里 更新时间:2023-11-01 17:06:10 24 4
gpt4 key购买 nike

@interface ViewController ()
@property (nonatomic, strong) NSString *someString;
@end

@implementation ViewController

@synthesize someString = _someString;

- (NSString *)someString {
__block NSString *tmp;
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
tmp = _someString;
});
return tmp;
}

- (void)setSomeString:(NSString *)someString {
__block NSString *tmp;
dispatch_barrier_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
tmp = someString;
});
_someString = tmp;
}
@end

有人说它比 @synchronized 方式更好,因为所有锁定都在 GCD 中处理。

最佳答案

首先,您的 setter 根本没有意义,使用默认的并发队列也可能不是您想要的。您的代码可能看起来更像:

@interface ViewController ()
@property (nonatomic, copy) NSString *someString;
@end

@implementation ViewController
{
dispatch_queue_t _stateGuardQueue;
}

- (instancetype)init
{
if (self = [super init])
{
_stateGuardQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
}
return self;
}

@synthesize someString = _someString;

- (NSString *)someString {
__block NSString *tmp;
dispatch_sync(_stateGuardQueue, ^{
tmp = _someString;
});
return tmp;
}

- (void)setSomeString:(NSString *)someString {
NSString* tmp = [someString copy];
dispatch_barrier_async(_stateGuardQueue, ^{
_someString = tmp;
});
}

@end

我所做的改变:

  • 让 setter 在临界区内实际执行突变
  • 使用私有(private)的、基于实例的并发队列而不是全局默认的并发队列;将障碍 block 提交到默认并发队列并不会像您认为的那样工作。 (参见 docs)
  • dispatch_barrier_sync 更改为 dispatch_barrier_async 同步等待 setter block 返回毫无意义,因为无法在当前线程上获取过时读取。
  • 将属性更改为具有 copy 语义,这对于值语义类型(NSString 等)始终是一个很好的做法。这在属性的情况下尤为重要可能从多个线程同时读取。

要知道的是,在孤立的情况下,此模式提供的“安全性”不超过原子属性,因此您可以说应该只使用那些(更少的代码等)。至于性能问题,是的,对于这种特殊用途,GCD 肯定会优于 @synchronized。其一,它允许并发读取,其中 @synchronized 将序列化并发读取。如果不进行测试,我希望原子属性的性能优于两者。也就是说,原子属性和以这种方式保护单个操作通常很少是一个足够的并发策略。

关于ios - 这个 GCD 实现的 getter setter 线程安全并且比@synchronized 工作得更好吗?对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29093312/

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