多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
boost主要提供了三种无锁的方案: boost::lockfree::queue: 支持多个生产者和多个消费者线程的无锁队列。 boost::lockfree::stack: 支持多个生产者和多个消费者线程的无所栈。 boost::lockfree::spsc\_queue: 仅支持单个生产者和单个消费者线程的无锁队列。但相比于boost::lockfree::queue效率更高。 这些API内部都是通过轻量级原子锁实现但lock\_free,并不是真正意义上的无锁。 还有人借std::atomic实现了一套无锁队列,其内部实现参考了boost::lockfree::queue的设计,适用于多个生产者和多个消费者线程。 实现方式:简单来说,在数据集的每个数据前添加标志(ABA的预防标签),说明是否该数据是否正在被操作,如果被操作,就等待其操作完成,再执行,如果没有就执行下去。 可能会问这个和线程锁有什么不同? 有很大的区别,范围不一样,线程锁是对整个数据集操作锁住。 比如当线程1操作队列的时候,线程2将不能操作,就是说只要队列里任何的数据被操作,其他线程就只能等待其完成。而boost无锁只对队列里面的某一个元素做锁。 试想,多线程同时对队列某个元素访问的概率是非常小的,而且操作完 某个元素的时间也是微乎其微。所以基本上可以说是无锁(lockfree)。 总的来说,无锁其实就是以空间(内存)换效率的做法。牺牲一部分内存(ABA的标签)来换取程序的执行效率。