NSMutableArray集合和@Synchronized块

Cle*_*t M 6 multithreading objective-c synchronized nsmutablearray ios

在Objective C中我使用了来自各种线程的NSMutableArray实例,并且我正在使用@synchronized来使其线程安全.目前我对这个数组的所有访问都受到@synchronized块的保护,甚至是objectAtIndex:方法.不过我想知道哪些方法确实需要用@synchronized保护.我需要保护读取权限吗?

如果'ObjectAtIndex'没有受到保护并且在'removeObject'的同时被调用会发生什么?

如果所有方法都受@synchronized保护,性能如何?(我正在写一个tcp/udp游戏服务器,如果它会降低性能或生成锁定,我真的不想过度保护这些数组).

例如,我想'containsObject:'方法将枚举以查找对象,并且我应该避免在另一个线程中对'removeObject:'进行concurent调用.

也许一个好的解决方案是拥有太多不同的锁(用于读写访问)......

欢迎提供帮助和建议!

非常感谢.

请在下面找到示例代码来说明:

@interface TestClass : NSObject
{
    NSMutableArray * array;
}

@end

@implementation TestClass

- (id)init
{
    self = [super init];
    if (self)
    {
        array = [NSMutableArray array];
    }
    return self;
}

-(id)objectAtIndex:(NSUInteger)index
{
    @synchronized(array) **// IS IT USEFUL OR NOT ??**
    {
        return [array objectAtIndex:index];
    }
}

-(void)removeObject:(id)object
{
    @synchronized(array)
    {
        [array removeObject:object];
    }
}

-(void)compute
{
    @synchronized(array)
    {
        for (id object in array)
        {
            [object compute];
        }
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

Ken*_*ses 5

是的,您必须同步读取访问以防止它们与突变同时发生.但是,读访问可以安全地与其他读访问同时运行.

如果你有多个读者,那么值得研究一个读写锁定方案.您可以使用pthread读写锁(即pthread_rwlock_...()).

或者,您可以在OS X 10.7+和iOS 5+上使用GCD和"屏障"例程.创建专用并发队列.以正常方式(例如dispatch_sync())提交所有读取操作.使用诸如的屏障例程向其提交变异操作dispatch_barrier_async().(它可以是异步的,因为您通常不需要知道突变在继续之前已经完成.您只需要知道在提交突变后提交的所有读取都将看到突变的结果,并且屏障保证了这一点. )

如果您有权访问Session 210 - Mastering Grand Central DispatchWWDC 2011会话视频,您可以了解更多相关信息.