我有第三方代码,它使用以下代码创建了很多线程:
while (true) {
{
my::Lock lock(&mMutex); // mutex implementation in c++
if (!reseting) {
// some code
break;
}
}
usleep(1000 / 20); // 20 time per second
}
我可以使用semaphore
重写此代码。使用什么,semaphore
或sleep
?据我所知他们的工作相同。 Semaphore
会更快一些,因为我们可以在thread
更改时立即继续此reset
。
或许你还有另一个想法如何更好地做到这一点?
my::Lock
的实施:
Lock::Lock(pthread_mutex_t *mutex) {
_mutex = mutex;
pthread_mutex_lock(_mutex);
}
Lock::~Lock() {
pthread_mutex_unlock(_mutex);
}
答案 0 :(得分:1)
你是正确的,民意调查是一种效率低下的方法。这种互斥锁实现只会使情况变得更糟。
你问一个信号量是否可能是更好的模式:它可能是,但我怀疑你可以做得更好。具体来说,我想到了三种异步模式:
"完成处理程序"模式,其中API调用采用块参数,该参数是异步任务完成时将调用的代码块。当您需要一个简单的接口来通知调用者完成异步任务时,这是理想的。
" delegate-protocol"模式,其中API将具有delegate
属性以指定通知对象,以及用于定义delegate
可能或必须实现的方法的协议。这是一种有用的模式,其中用于通信更新的接口更复杂(例如,不仅仅是在任务完成时,还可能是各种进度更新)。
"通知"模式(使用NSNotificationCenter
通知其他对象的状态更改)。如果可能希望多个对象被告知任务完成,则此功能非常有用。
坦率地说,这个选择可能取决于这个第三方库的细节。根据所提供的信息进行评估很难。