无锁队列概述

无锁队列概述一 无锁队列原理 1 队列操作模型队列是一种非常重要的数据结构 其特性是先进先出 FIFO 符合流水线业务流程 在进程间通信 网络通信间经常采用队列做缓存 缓解数据处理压力 根据操作队列的场景分为 单生产者 单消费者 多生产者 单消费者 单生产者 多消费者 多生产者 多消费者四大模型 根据队列中数据分为 队列中的数据是定长的 队列中的数据是变长的 1 单生产者 单消费者 2 多生产者 单消费者 3 单生产者 多消费者

一、无锁队列原理

1、队列操作模型

        队列是一种非常重要的数据结构,其特性是先进先出(FIFO),符合流水线业务流程。在进程间通信、网络通信间经常采用队列做缓存,缓解数据处理压力。

        根据操作队列的场景分为:单生产者——单消费者、多生产者——单消费者、单生产者——多消费者、多生产者——多消费者四大模型。根据队列中数据分为:队列中的数据是定长的、队列中的数据是变长的。

(1)单生产者——单消费者

无锁队列概述

 (2)多生产者——单消费者

无锁队列概述

 (3)单生产者——多消费者

无锁队列概述

 (4)多生产者——多消费者

无锁队列概述

 (5)数据定长队列

无锁队列概述

 (6)数据变长队列

无锁队列概述

2、 无锁队列

        生产环境中广泛使用生产者和消费者模型,要求生产者在生产的同时,消费者可以进行消费,通常使用互斥锁保证数据同步。但线程互斥锁的开销仍然比较大,因此在要求高性能、低延时场景中,推荐使用无锁队列。

3、CAS操作

bool compare_and_swap ( int *memory_location, int expected_value, int new_value) { if (*memory_location == expected_value) { *memory_location = new_value; return true; } return false; }
bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...); type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...);

(2)Windows对CAS支持
Windows中使用Windows API支持CAS。

LONG InterlockedCompareExchange( LONG volatile *Destination, LONG ExChange, LONG Comperand );

(3)C11对CAS支持
C11 STL中atomic函数支持CAS并可以跨平台。

template< class T > bool atomic_compare_exchange_weak( std::atomic* obj,T* expected, T desired ); template< class T > bool atomic_compare_exchange_weak( volatile std::atomic* obj,T* expected, T desired );

二、无锁队列方案

1、boost方案

2、ConcurrentQueue

三、无锁队列实现

1、环形缓冲区

 

C++性能优化(十三)——无锁队列_无锁队列_07

 空队列时,front与rear相等;当有元素进队,则rear后移;有元素出队,则front后移。

C++性能优化(十三)——无锁队列_无锁队列_08

data[rear] = x; rear = (rear+1)%maxn;

出队操作:

x = data[front]; rear = (front+1)%maxn;

2、单生产者单消费者

3、多生产者单消费者

多生产者和单消费者场景中,由于多个生产者都会修改write_index,所以在不加锁的情况下必须使用原子操作。

四、无锁队列使用

1、ConcurrentQueue无锁队列

实现demo如下:

lock_free_queue_impl.h

#pragma once #include 
  
    #include 
   
     #include 
    
      #include 
     
       #include"concurrentqueue.h" class Response { public: ~Response() { std::cout << "~Response()" << std::endl; } int status_code; int content; }; class LockFreeImpl { public: LockFreeImpl() {} ~LockFreeImpl() {} static LockFreeImpl& GetRef(); void Init(); void DoJob(); void OnMessage(std::shared_ptr 
      
        response); void HandleMsg(std::shared_ptr 
       
         response); void Release(); private: volatile bool inited_ = false; std::thread work_thread_; moodycamel::ConcurrentQueue 
        
          >* worker_queue_; }; 
         
        
       
      
     
    
  

 lock_free_queue_impl.cpp

#include"lock_free_queue_impl.h" #include 
  
    LockFreeImpl& LockFreeImpl::GetRef() { static LockFreeImpl impl; return impl; } void LockFreeImpl::Init() { inited_ = true; worker_queue_ = new moodycamel::ConcurrentQueue 
   
     >(81920, 1, 1); work_thread_ = std::thread(std::bind(&LockFreeImpl::DoJob, this)); std::cout << "LockFreeImpl init successfully!" << std::endl; } void LockFreeImpl::DoJob() { std::cout << "worker thread, worker thread start!" << std::endl; std::shared_ptr 
    
      item = nullptr; while (inited_) { if (worker_queue_->try_dequeue(item) == false) { Sleep(10); continue; } if (item == nullptr) std::cout << "item == nullptr" << std::endl; else { HandleMsg(item); } } std::cout << "worker thread, worker thread exit successfully!" << std::endl; } void LockFreeImpl::OnMessage(std::shared_ptr 
     
       response) { try { worker_queue_->try_enqueue(response); } catch (const std::exception& e) { std::cout << "the error is: " << e.what() << std::endl; } } void LockFreeImpl::HandleMsg(std::shared_ptr 
      
        response) { std::cout << "\n ----------------------开始解析数据----------------------" << std::endl; std::cout << "response->status_code is: " << response->status_code << std::endl; std::cout << "response->content is: " << response->content << std::endl; } void LockFreeImpl::Release() { if (inited_) inited_ = false; if (work_thread_.joinable()) work_thread_.join(); delete worker_queue_; std::cout << "LockFreeImpl release,release exit successfully!" << std::endl; } 
       
      
     
    
  

main.cpp

#include 
  
    #include 
   
     #include"lock_free_queue_impl.h" using namespace std; int main() { LockFreeImpl lock_free_impl; lock_free_impl.Init(); std::shared_ptr 
    
      response(new Response()); response->status_code = 0; response->content = 1; for (int i = 0; i < 4; ++i) { std::cout << "开始push数据...." << std::endl; Sleep(1000); lock_free_impl.OnMessage(response); } system("pause"); lock_free_impl.Release(); return 0; } 
     
    
  

结果如下:

无锁队列概述

 concurrentqueue.h 文件下载上文链接

参考链接:

https://blog.51cto.com/u_/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201670.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午8:53
下一篇 2026年3月20日 上午8:53


相关推荐

  • gridbaglayout布局_gridsearch

    gridbaglayout布局_gridsearch自己想做个小程序,却在布局上犯了难,使用FlowLayout和BorderLayout这些功能不够强大,使用GridBagLayout却不会,只好求助于文档了。文档对这个布局管理器介绍很详细,但是最痛苦的是英文。不过幸好它有实例,经过在网上查阅和推敲实例,终于对GridBagLayout的使用有了一个成型的了解,拿出来与大家分享。GridBagLayout是一个灵活的布局管理器,部件如果想

    2025年10月11日
    3
  • 【编译原理】【C语言】实验三:递归下降分析法

    【编译原理】【C语言】实验三:递归下降分析法递归下降分析法 1 实验内容 2 前期准备 2 1 递归下降分析法原理 2 2 要实现的文法 2 3 需要的函数 3 分析过程 3 1 递归下降分析法设计思想及算法 3 2 分析栈的分析过程 3 3 流程图 3 4 源代码 3 5 运行结果 4 遇到问题 1 实验内容 用高级语言实现递归下降分析程序 使用输入串 i i i 输出分析栈中所有内容 并给出分析结果 2 前期准备 2 1 递归下降分析法原理 自顶向下分析就是从文法的开始符触发并寻找出这样一个推导序列 推导出的句子恰好为输入符号串 或

    2026年3月17日
    2
  • AB PLC整理

    AB PLC整理1 CPU1756 各个类型 https wenku baidu com view 12a4fb55f533 html from search2 Powersupplyh wenku baidu com view 2705b3011ed9 html sxts 155383790918 I Omodulehttps

    2026年3月16日
    2
  • java取两个list的交集_怎么判断两个list有交集

    java取两个list的交集_怎么判断两个list有交集List<Integer>accountIdListOne=newArrayList<>();accountIdListOne.add(1);accountIdListOne.add(2);accountIdListOne.add(3);List<Integer>accountIdListTwo=newArrayList<>();acc…

    2022年10月7日
    7
  • redis实现分布式锁的原理_Redis作为分布式锁原理

    redis实现分布式锁的原理_Redis作为分布式锁原理一、写在前面现在面试,一般都会聊聊分布式系统这块的东西。通常面试官都会从服务框架(SpringCloud、Dubbo)聊起,一路聊到分布式事务、分布式锁、ZooKeeper等知识。所以咱们这篇文章就来聊聊分布式锁这块知识,具体的来看看Redis分布式锁的实现原理。说实话,如果在公司里落地生产环境用分布式锁的时候,一定是会用开源类库的,比如Redis分布式锁,一般就是…

    2025年7月25日
    5
  • 1.1 智能体 (Agents)

    1.1 智能体 (Agents)

    2026年3月15日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号