首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSLock“控制器”类

NSLock“控制器”类
EN

Stack Overflow用户
提问于 2011-09-15 14:53:06
回答 2查看 726关注 0票数 2

我正在为iPhone编写一个多线程应用程序,并且我正在使用NSLock来确保某些操作(比如从文件中加载声音)将表现为原子操作。为了简化从应用程序的不同部分获取锁的过程,我编写了以下类,它允许我通过传递NSString和name来锁定和解锁锁。如果这样的锁不存在,它会创建它并保存以备将来使用。我测试了它,它似乎工作得很好(因为它只提供对NSLock对象的访问,而不会改变它们的行为)。

我的问题是:拥有和使用这样的类可以吗,或者我对锁的概念有一些误解?

代码语言:javascript
复制
Locker.h

#import <Foundation/Foundation.h>

@interface Locker : NSObject { }

+ (void) purgeLocks;
+ (NSLock*) lockWithName: (NSString*) name;
+ (void) lock: (NSString*) name;
+ (void) unlock: (NSString*) name;
+ (BOOL) tryLock: (NSString*) name;

@end



Locker.m

#import "Locker.h"

static NSMutableDictionary* locks = nil;

@implementation Locker

+ (void) initialize {
    locks = [[NSMutableDictionary dictionary] retain];
}

+ (void) purgeLocks {
    [locks release];
    [Locker initialize];
}

+ (NSLock*) lockWithName: (NSString*) name {
    NSLock* lock = nil;
    @synchronized([Locker class]) {
        lock = [locks objectForKey: name];
        if(!lock) {
            lock = [[[NSLock alloc] init] autorelease];
            [lock setName: name];
            [locks setObject: lock forKey: name];
        }
    }
    return lock;
}

+ (void) lock: (NSString*) name {
    [[Locker lockWithName: name] lock];
}

+ (void) unlock: (NSString*) name {
    [[Locker lockWithName: name] unlock];
}

+ (BOOL) tryLock: (NSString*) name {
    return [[Locker lockWithName: name] tryLock];
}

@end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-15 15:16:20

对我来说这看起来很重。你确定你不能简化设计吗?(GCD出现在我的脑海中。)几乎每一个iOS应用程序都是多线程的,我很少看到像你写的那样的锁定助手。如果有什么地方能让KISS principle大放异彩的话,我敢肯定那就是多线程。

票数 0
EN

Stack Overflow用户

发布于 2011-09-15 15:06:49

@synchronized is slow,避开它。在+ initialize中分配一个锁并使用它。但我会选择单例,而不是使用类方法,但这或多或少是一个品味问题。

这种方法的主要缺点是,您必须锁定一个锁才能获得另一个锁。在大量多线程的应用程序中,即使线程都想访问不同的锁,这个元锁(当前的@synchronized)也会成为性能瓶颈。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7426930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档