后台线程的睡眠或信号量
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
重写这段代码。使用什么,semaphore
或 sleep
?据我了解,它们的工作原理相同。 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
通知其他对象状态变化)。如果有可能不止一个对象想要通知任务完成,这将很有用。
坦率地说,选择可能取决于这个第三方库的细节。很难根据提供的信息进行评估。
我有第三方代码创建了很多线程,代码如下:
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
会工作得更快一些,因为当 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
通知其他对象状态变化)。如果有可能不止一个对象想要通知任务完成,这将很有用。
坦率地说,选择可能取决于这个第三方库的细节。很难根据提供的信息进行评估。