gpt4 book ai didi

c++ - 在 C++ 中使用原子 TestAndSet 混合无锁和全锁线程同步

转载 作者:行者123 更新时间:2023-11-30 01:15:22 25 4
gpt4 key购买 nike

我有一个消费者线程,它必须不锁定 从缓冲区中读取。如果因为生产者线程正在写入缓冲区而必须跳过该操作,那也没关系。因此,在我看来最合适的选择是在某些标志上使用原子 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()查看数据是否可以安全读取或是否正在进行写入。

关于c++ - 在 C++ 中使用原子 TestAndSet 混合无锁和全锁线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28552056/

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