[英]Mixing lock-less and lock-full thread synchronization with atomic TestAndSet in C++
我有一个使用者线程,该线程必须从缓冲区读取而不会锁定 。 如果因为生产者线程正在写入缓冲区而必须跳过该操作,那就很好。 因此,在我看来,最合适的选择是在某个标志上执行原子TestAndSet 。
现在,前面提到的那些生产者线程也必须遵守该标志,因为在使用者从中读取缓冲区时它们无法开始写入缓冲区。 我可以使用atomic_flag :: test_and_set来解决此问题,如以下代码所示:
while (flag.test_and_set())
{
std::this_thread::sleep_for(std::chrono::seconds(1));
}
...但是写我自己的自旋锁似乎不太理想 。 我宁愿让线程处于睡眠状态,直到由于清除标志而将其唤醒。 就像是:
flag.enter();
TLDR:如何最好地同步两个线程,一个线程可以锁定而另一个线程不能锁定?
使用std::mutex
。
读者可以使用try_lock
来避免阻塞。
编写者(生产者)可以照常使用阻止lock
功能。
当然,为避免泄漏锁,请使用std::unique_lock
。 读者应将std::try_to_lock
作为第二个参数传递。 然后,您应该检查owns_lock()
以查看是否可以安全地读取数据或正在进行写入。
您不能混合和匹配同步方法-双方都必须同意。 在我看来,您真正想要的是尝试获取该锁,然后如果失败,请跳过。 您可以在常规std::mutex
上使用try_lock来实现此目的。
如果希望生产者在阅读器阅读时阻塞,则无锁是不可能的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.