gpt4 book ai didi

c++ - 使用互斥操作和原语实现信号量

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:02 25 4
gpt4 key购买 nike

前段时间面试,被要求实现仅使用互斥操作和原语的信号量(他允许 int 被认为是原子的)。我在下面提出了解决方案。他不喜欢忙/等待部分 -- while (count >= size) {} -- 并要求通过使用更原始的方式来实现锁定类型和互斥体。我没有设法提出改进的解决方案。有什么想法可以做到吗?

struct Semaphore {
int size;
atomic<int> count;
mutex updateMutex;

Semaphore(int n) : size(n) { count.store(0); }

void aquire() {
while (1) {
while (count >= size) {}
updateMutex.lock();
if (count >= size) {
updateMutex.unlock();
continue;
}
++count;
updateMutex.unlock();
break;
}
}

void release() {
updateMutex.lock();
if (count > 0) {
--count;
} // else log err
updateMutex.unlock();
}
};

最佳答案

我敢打赌,如果没有忙循环仅使用互斥锁,这是不可能实现的。

如果不是忙循环,你必须在某个地方阻塞。你唯一的阻塞原语是一个互斥体。因此,当信号量计数器为零时,您必须阻塞某些互斥体。您可以只能被该互斥锁的单个所有者唤醒。但是,每当任意线程返回信号量的计数器时,您应该醒来。

现在,如果允许使用条件变量,情况就完全不同了。

关于c++ - 使用互斥操作和原语实现信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20534782/

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