【问题标题】:iPhone: How can I implement semaphore?iPhone:如何实现信号量?
【发布时间】:2011-10-04 14:19:54
【问题描述】:

谁能解释我如何在 Objective-C 中实现信号量? 我在这个主题上做了很多谷歌搜索,但我没有找到任何可以理解的内容。

【问题讨论】:

    标签: iphone objective-c semaphore


    【解决方案1】:

    如果您确实需要一个实际的信号量,最好使用 GCD 的 dispatch semaphores。我会解释一下,但链接中的代码非常简单。您应该能够遵循它。

    基本上,您使用一个参数来创建信号量,该参数指示您可以拥有的资源的并发实例数。然后,想要使用资源的线程在信号量上等待,直到有一个可用,并在完成时发出信号。

    考虑使用dispatch queueNSOperationQueue 来代替资源实例数的并发限制。这是 Apple 认可的执行此类操作的方式。

    【讨论】:

    【解决方案2】:

    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 例程。

    【讨论】:

      【解决方案3】:

      如果您想自己处理数据保护和临界区,您应该考虑使用NSLockNSCondition。您也可以使用@synchronized directive。如果您喜欢它,您也可以只使用通常的 POSIX 线程 API,尽管不推荐使用它,因为 Cocoa 为您提供了许多更简单和更好的更高级别的东西。这个discussion 对我很有用。

      【讨论】:

        【解决方案4】:

        来自Apple Docs (Threading)

        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.
            ...
        }
        

        【讨论】:

        • 信号量不仅仅是一个锁。
        • @JeremyP 同意,但是如果您指的是计数信号量(可以多次锁定/获取和解锁/发出信号),那么 NSRecursiveLock 应该可以解决问题。
        • @jbat100: NSRecusiveLock 也不是信号量。
        • @JeremyP 你能告诉我关键的区别吗?我找到的定义是:“在计算机科学中,信号量是一种变量或抽象数据类型,它提供了一种简单但有用的抽象来控制并行编程环境中多个进程对公共资源的访问。”
        • @jbat100:信号量通常实现为从初始值开始的计数器。等待信号量的进程试图递减计数器,如果计数器为零,它会阻塞,直到计数器被其他进程递增。当信号量完成后,进程会向它发出信号,它要么递增计数器,要么如果进程在其上被阻塞,则解除对进程的阻塞。
        猜你喜欢
        • 2011-08-25
        • 2011-07-23
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 2011-07-18
        • 2012-05-16
        • 2012-12-09
        相关资源
        最近更新 更多