c++ - 无锁 C++ 数据结构,不可能吗?

标签 c++ multithreading concurrency lockless

我真的不明白你怎么能让一些数据结构无锁。例如,如果你有一个链表,那么要么你用互斥体包围操作,要么如果另一个线程在你忙于将新节点重新链接在一起时执行,你可能会以竞争条件结束。

“无锁”的概念(我很欣赏它并不意味着“无锁”,而是意味着线程可以在不等待其他线程完成的情况下继续前进)只是没有意义。

谁能告诉我一个使用堆栈、队列或链表等实现为“无锁”的简单示例,因为我不明白如何在不干扰其他线程生产力的情况下防止竞争条件?这两个目标肯定相互矛盾吗?

最佳答案

无锁数据结构使用原子操作,可能会提出额外的要求。例如,数据结构可能只对一个读取器和一个写入器线程或任何其他组合是安全的。在简单链表的情况下,将使用对节点指针的原子读写,以保证多个线程可以同时安全地对其进行读写。

您可能会也可能不会逃脱。如果您需要关于数据结构和验证内容的额外保证,如果没有某种形式的高级锁定,您可能无法做到这一点。此外,并非每个数据结构都允许重写为无锁,即使考虑到对如何使用数据结构的额外要求也是如此。在这些情况下,不可变对象(immutable对象)可能是一种解决方案,但它们通常会因复制而带来性能损失,这并不总是比锁定对象然后改变它更可取。

关于c++ - 无锁 C++ 数据结构,不可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22120192/

相关文章:

java - 执行超时后返回的长时间计算

java - 网络服务器流式传输数据数组中的消费者-生产者问题

c++ - 用自定义数据类型定义接口(interface):如何保持可读性?

c++ - 使用 gdb 调试 C++ 模板

c - 如何通过线程打破C中的简单for无限循环

java - 线程 "Thread-5"java.lang.NullPointerException 中的异常

c++ - 整数不会超过随机数

c++ - log4cplus是否支持xml配置文件和条件日志记录?

multithreading - 是否应该在长时间运行的进程中留下空闲线程?

java - 区分 Java 编程语言监视器和等待/通知监视器的术语