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

标签 c++ multithreading synchronization atomic test-and-set

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

相关文章:

c++ - 从另一个文件访问 C++ 中的 extern "C"变量

c++ - 如何使用 UIA 获取 HEX 中 IUIAutomationElement 的窗口句柄?

multithreading - bash:写入命名管道是原子的吗?

c++ - 在 OpenMP C++ 中使用并行 block 时没有看到任何显着改进

node.js - 我们可以使用多线程并行运行 async() 吗?

java - 处理去同步

c++ - 从 C++ 代码到 Common Lisp 代码的 RPC

c++ - 如何强制 32 位版本的远程桌面客户端在 64 位 Vista 上运行?

java - 如何根据用户的请求暂停和恢复多个 Java 线程?

multithreading - Delphi MREW 实现对读者有利吗?