objective-c - 后台线程的 sleep 或信号量

标签 objective-c multithreading semaphore objective-c++ thread-sleep

我有第三方代码,它使用这样的代码创建了很多线程:

while (true) {
    {
        my::Lock lock(&mMutex); // mutex implementation in c++
        if (!reseting) {
            // some code
            break;
        }
    }
    usleep(1000 / 20); // 20 time per second
}

我可以用 semaphore 重写这段代码.用什么,semaphoresleep ?据我了解,它们的工作方式相同。 Semaphore工作会快一点,因为我们可以立即继续 threadreset被改变。

或者也许你有另一个想法如何更好地做到这一点?
my::Lock的实现:
Lock::Lock(pthread_mutex_t *mutex) {
    _mutex = mutex;
    pthread_mutex_lock(_mutex);
}

Lock::~Lock() {
    pthread_mutex_unlock(_mutex);
}

最佳答案

您是正确的,轮询是一种低效的方法。这种互斥锁实现只会使情况变得更糟。

你问信号量是否可能是更好的模式:它可能是,但我怀疑你可以做得更好。具体来说,我想到了三种异步模式:

  • “完成处理程序”模式,其中 API 调用采用 block 参数,该参数是异步任务完成时将调用的代码块。当您需要一个简单的接口(interface)来通知调用者异步任务的完成时,这是理想的选择。
  • delegate-protocol ”模式,其中 API 将具有 delegate属性来指定通知谁和​​定义delegate的方法的协议(protocol)可能或必须实现。这是一种有用的模式,用于通信更新的接口(interface)更复杂(例如,不仅是在任务完成时,还可能是各种进度更新)。
  • “通知”模式(使用 NSNotificationCenter 通知其他对象状态更改)。如果有可能不止一个对象想要获知任务的完成,这将很有用。

  • 坦率地说,选择可能取决于这个第三方库的细节。很难根据提供的信息进行评估。

    关于objective-c - 后台线程的 sleep 或信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30374206/

    相关文章:

    ios - 在 iOS 9 中自定义 ContactPicker UI

    objective-c - Cocos2d : Emitted particles do not pan correctly with screen

    ios - 绘制将在 objective-c 中绘制头骨的动画

    multithreading - 如何解除阻塞等待信号量的所有线程?

    java - 使用 Java 在线程之间传输数据

    ios - 单击更改多个 UIButton 的背景颜色

    java - 使用 log4j 在日志文件中打印线程 ID

    python - 如何将新 URL 传递给 Scrapy Crawler

    c - C11中的内存顺序消耗用法

    c - Pthreads,尝试使用信号量从多个线程打印数字部分