我有一个消费者线程,必须从缓冲区中读取而无需锁定。如果由于生产者线程正在写入缓冲区而必须跳过该操作,那很好。因此,在我看来,最合适的选择是某个标志上的原子 TestAndSet。
现在,前面提到的生产者线程也必须尊重这个标志,因为当消费者正在读取缓冲区时,它们不能开始写入缓冲区。我可以使用 atomic_flag::test_and_set 来解决这个问题,如下代码:
while (flag.test_and_set())
{
std::this_thread::sleep_for(std::chrono::seconds(1));
}
...但是编写我自己的自旋锁似乎不太理想。我宁愿让我的线程休眠,直到它由于标志被清除而被唤醒。就像是:
flag.enter();
TLDR:如何最好地同步两个线程,一个可以锁定,另一个不能?