锁定目标C中的整个班级

时间:2013-07-01 15:50:56

标签: ios objective-c multithreading synchronized

我有一个非常简单的问题,我希望有人可以指出我正确的方向。我是一名java开发人员,试图找出全局锁定的正确目标C方法。我有一个在几个地方实例化的类。每个实例都读取和写入单个公共文件。因此,我需要确保此类中的所有方法调用都是原子的。在java中,这将按如下方式完成:

static Object lock

public void writeToFile(){
    synchronized(lock){
      //thread safe code goes here
    }
}

静态标识符意味着锁定对象在所有实例之间共享,因此是线程安全的。不幸的是,由于iOS没有相同的类变量,我不确定实现此功能的最佳方法是什么。

1 个答案:

答案 0 :(得分:4)

如果您想要的只是一个简单的全局锁定,请查看NSLock。

例如:

static NSLock * myGlobalLock = [[NSLock alloc] init];

if ([myGlobalLock tryLock]) {
    // do something
    [myGlobalLock unlock];
}
else {
    // couldn't acquire lock
}

但是,这会导致性能下降,因为它需要内核调用。如果要序列化对资源的访问,使用Grand Central Dispatch和私有队列将会更好地执行 - 这些都是在不需要内核中断的情况下进行的。

例如:

// alloc a dispatch queue for controlling access to your shared resource
static dispatch_queue_t mySharedResourceQueue = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    mySharedResourceQueue = dispatch_queue_create("com.myidentifier.MySharedResourceQueue", DISPATCH_QUEUE_SERIAL); // pick a unique identifier
});
// don't forget to call dispatch_release() to clean up your queue when done with it!

// to serialize access to your shared resource and block the current thread...
dispatch_sync(mySharedResourceQueue, ^{
    // access my shared resource
});

// or to access it asynchronously, w/o blocking the current thread...
dispatch_async(mySharedResourceQueue, ^{
    // access my shared resource
});

调度队列是非常棒的东西,如果你正在进入iOS开发,你应该学习如何使用它们,以便使应用程序具有出色的性能。

除了NSLock之外,还有不同类型的锁。在线程编程参考中阅读同步以获取更多信息...

螺纹编程参考: https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html#//apple_ref/doc/uid/10000057i

NSLock参考: https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSLock_Class/Reference/Reference.html

Grand Central Dispatch参考:https://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html