Objective c 背景线程的睡眠或信号量
我有第三方代码,它创建了很多线程,代码如下:Objective c 背景线程的睡眠或信号量,objective-c,multithreading,semaphore,objective-c++,thread-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 } 我可以用信号
while (true) {
{
my::Lock lock(&mMutex); // mutex implementation in c++
if (!reseting) {
// some code
break;
}
}
usleep(1000 / 20); // 20 time per second
}
我可以用信号量
重写这段代码。使用什么,信号灯
或睡眠
?据我所知,它们的工作原理是一样的<代码>信号量将工作得更快一些,因为当重置
发生更改时,我们可以立即继续执行此线程
或者你有另一个更好的办法
my::Lock的实现
:
Lock::Lock(pthread_mutex_t *mutex) {
_mutex = mutex;
pthread_mutex_lock(_mutex);
}
Lock::~Lock() {
pthread_mutex_unlock(_mutex);
}
你是对的,轮询是一种低效的方法。这种互斥锁实现只会让情况变得更糟 你问信号量是否可能是更好的模式:它可能是,但我怀疑你可以做得更好。具体来说,我想到了三种异步模式:
- “completion handler”模式,其中API调用采用块参数,该块参数是异步任务完成时将调用的代码块。当您需要一个简单的接口来通知调用方异步任务的完成时,这是理想的
- “”模式,其中API将有一个
属性来指定通知谁,以及一个协议,该协议定义了delegate
可以或必须实现的方法。这是一种有用的模式,用于通信更新的接口更加复杂(例如,不仅仅是在任务完成时,还可能是各种进度更新)delegate
- “通知”模式(使用
通知其他对象状态更改)。如果可能有多个对象需要通知任务的完成情况,这将非常有用NSNotificationCenter
坦率地说,选择可能取决于这个第三方库的细节。很难根据提供的信息进行评估。
my::Lock
在释放时解锁互斥锁。此对象在usleep
之前发布。后台的这个过程有时会使用睡眠代码进行大量计算,所以我相信当睡眠被调用时,处理器仍然工作,但在另一个线程上。啊,释放时重新解锁,这是有意义的。这就解释了神秘的{
作用域。我不确定另一个线程如何使用同一个锁(因为我假设该锁的目的是同步重置)。即使这不是问题,我也不喜欢这种隐式解锁模式。但所有这些都没有意义,因为更广泛的问题是轮询,(忽略使用互斥锁的事实!)每秒20次,效率很低。使用委托、完成块、通知或其他主动进程会更好。如果可能,请避免旋转/等待。此代码针对不同的体系结构编写。我如何知道使用睡眠是不好的做法。如果我用“完成处理程序”重写所有代码,我会获得更高的应用程序性能例如模式。现在创建了4-5个线程,其中需要进行大量计算。当一个线程处于睡眠状态时,处理器在另一个线程中进行计算。此外,如果我重写到某个模式,代码的可读性将降低。是的,轮询和usleep
不是很好,但是使用信号量通常也不是很好,依情况而定。但是,从从实际的角度来看,很有可能对这段代码进行更重要的重构并不值得付出努力,因为所获得的收益可能并不多。事实上,这一切都有过早优化的味道。