【发布时间】:2015-05-21 12:46:27
【问题描述】:
我有第三方代码,它使用这样的代码创建了很多线程:
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);
}
【问题讨论】:
-
my::Lock在释放时解锁互斥锁。此对象在usleep之前发布。这个后台进程有时会使用睡眠代码进行大量计算,所以我相信当调用睡眠时处理器仍然可以工作,但在另一个线程上。 -
啊,释放后重新解锁,有道理。这就解释了神秘的
{范围。不过,我不确定其他线程如何使用相同的锁(因为我假设该锁的目的是同步reseting)。即使这不是问题,我也不喜欢这种隐式解锁模式。但所有这些都没有实际意义,因为更广泛的问题是轮询,一般来说,(忽略使用互斥锁的事实!)每秒 20 次,效率低下。使用委托或完成块或通知或其他一些主动过程会更好。尽可能避免旋转/等待。
标签: objective-c multithreading semaphore objective-c++ thread-sleep