gpt4 book ai didi

multithreading - 在Mac OS X上与EnterCriticalSection最佳等效?

转载 作者:行者123 更新时间:2023-12-03 13:12:38 25 4
gpt4 key购买 nike

最好的等效是什么?对于这种简单功能,我没有找到任何合理的解决方案。我知道的选择:

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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com