繁体   English   中英

在C ++中将无锁和全锁线程同步与原子TestAndSet混合

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM