最好的等效是什么?对于这种简单功能,我没有找到任何合理的解决方案。我知道的选择:
1)MPEnterCriticalRegion-不幸的是,这是极其无效的,可能是因为尽管它的名字它进入了内核模式,所以对于重复锁定它只花费了太多时间...
2)OSSpinLockLock-无法使用,因为它显然不是递归的。如果它是递归的,那将是正确的等效项。
3)pthread_mutex_lock-没尝试,但是我期望不高,因为它可能只是使用关键区域或其他系统资源来模拟。
最佳答案
假设您具有正确工作的非递归锁,那么很容易获得有效的递归锁(不了解Mac API,所以这是伪代码):
class RecursiveLock {
public:
void acquire() {
auto tid = get_thread_id();
if (owner == tid) {
lockCnt++;
} else {
AcquireLock(lock);
owner = tid;
lockCnt = 1;
}
}
void release() {
assert(owner == get_thread_id());
lockCnt--;
if (lockCnt == 0) {
owner = 0; // some illegal value for thread id
ReleaseLock(lock);
}
}
private:
int lockCnt;
std::atomic<void*> owner;
void *lock; // use whatever lock you like here
};
原因很简单:
tid == owner
,则可以确保我们已经获取了锁。 tid != owner
要么有人持有该锁,要么它是免费的,在这两种情况下,我们都尝试获取该锁并进行阻塞,直到获得它为止。获取锁后,将所有者设置为tid。因此,有些时候我们已经获得了锁,但是owner
仍然是非法的。但是没有问题,因为非法的tid也不会等于任何真实线程的tid,因此它们也将进入else
分支,必须等待获取。 注意
std::atomic
部分-我们确实需要owner
字段的顺序保证才能使其合法。如果您没有c++ 11,则可以使用一些内在的编译器。
关于multithreading - 在Mac OS X上与EnterCriticalSection最佳等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24533965/