后台线程的睡眠或信号量

Sleep or semaphore for background thread

我有第三方代码创建了很多线程,代码如下:

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 会工作得更快一些,因为当 reset 改变时我们可以立即继续这个 thread

或者您有其他更好的方法?


实施my::Lock

Lock::Lock(pthread_mutex_t *mutex) {
    _mutex = mutex;
    pthread_mutex_lock(_mutex);
}

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

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

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

  • "completion handler" 模式,其中 API 调用采用块参数,该参数是将在异步任务完成时调用的代码块。当您需要一个简单的界面来通知调用者异步任务完成时,这是理想的选择。

  • delegate-protocol”模式,其中 API 将有一个 delegate 属性 来指定通知谁和​​定义的协议delegate 可能或必须实施哪些方法。这是一种有用的模式,用于通信更新的接口更加复杂(例如,不仅仅是任务完成时,也可能是各种进度更新)。

  • "notification"模式(使用NSNotificationCenter通知其他对象状态变化)。如果有可能不止一个对象想要通知任务完成,这将很有用。

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