睡眠或信号量为背景线程

时间:2015-05-21 12:46:28

标签: 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会更快一些,因为我们可以在thread更改时立即继续此reset

或许你还有另一个想法如何更好地做到这一点?

my::Lock的实施:

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

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

1 个答案:

答案 0 :(得分:1)

你是正确的,民意调查是一种效率低下的方法。这种互斥锁实现只会使情况变得更糟。

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

  • "完成处理程序"模式,其中API调用采用块参数,该参数是异步任务完成时将调用的代码块。当您需要一个简单的接口来通知调用者完成异步任务时,这是理想的。

  • " delegate-protocol"模式,其中API将具有delegate属性以指定通知对象,以及用于定义delegate可能或必须实现的方法的协议。这是一种有用的模式,其中用于通信更新的接口更复杂(例如,不仅仅是在任务完成时,还可能是各种进度更新)。

  • "通知"模式(使用NSNotificationCenter通知其他对象的状态更改)。如果可能希望多个对象被告知任务完成,则此功能非常有用。

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