【发布时间】:2011-10-04 14:19:54
【问题描述】:
谁能解释我如何在 Objective-C 中实现信号量? 我在这个主题上做了很多谷歌搜索,但我没有找到任何可以理解的内容。
【问题讨论】:
标签: iphone objective-c semaphore
谁能解释我如何在 Objective-C 中实现信号量? 我在这个主题上做了很多谷歌搜索,但我没有找到任何可以理解的内容。
【问题讨论】:
标签: iphone objective-c semaphore
如果您确实需要一个实际的信号量,最好使用 GCD 的 dispatch semaphores。我会解释一下,但链接中的代码非常简单。您应该能够遵循它。
基本上,您使用一个参数来创建信号量,该参数指示您可以拥有的资源的并发实例数。然后,想要使用资源的线程在信号量上等待,直到有一个可用,并在完成时发出信号。
考虑使用dispatch queue 或NSOperationQueue 来代替资源实例数的并发限制。这是 Apple 认可的执行此类操作的方式。
【讨论】:
C api 可以在sys/semaphore.h 中找到。在您的 objc 包装器/实现中使用这些。
this 基本示例是搜索“sem_trywait 示例”时的第一个结果。它向您展示了如何使用这些 API。
那么最小的接口将采用这种形式:
@interface MONSemaphore : NSObject
{
sem_t semaphore;
}
- (int)close;
- (int)destroy;
/* .. and the rest of the interface you wrap and make public here .. */
@end
但您可能还希望对象从客户端抽象出 init 和 destruct 例程。
【讨论】:
如果您想自己处理数据保护和临界区,您应该考虑使用NSLock 或NSCondition。您也可以使用@synchronized directive。如果您喜欢它,您也可以只使用通常的 POSIX 线程 API,尽管不推荐使用它,因为 Cocoa 为您提供了许多更简单和更好的更高级别的东西。这个discussion 对我很有用。
【讨论】:
Objective-C 支持应用程序中的多线程。因此,两个线程可以尝试同时修改同一个对象,这种情况可能会导致程序出现严重问题。为了保护代码段不被多个线程同时执行,Objective-C 提供了@synchronized() 指令。
@synchronized() 指令锁定一段代码以供单个线程使用。其他线程被阻塞,直到线程退出受保护的代码——也就是说,当执行继续超过 @synchronized() 块中的最后一条语句时。
@synchronized() 指令将任何 Objective-C 对象(包括 self)作为其唯一参数。该对象称为互斥信号量或互斥体。它允许一个线程锁定一段代码以防止它被其他线程使用。您应该使用单独的信号量来保护程序的不同关键部分。在应用程序变为多线程之前创建所有互斥对象是最安全的,以避免竞争条件。
例子:
Account *account = [Account accountFromString:[accountField stringValue]];
// Get the semaphore.
id accountSemaphore = [Account semaphore];
@synchronized(accountSemaphore) {
// Critical code.
...
}
【讨论】: