c/c++ linux后台开发 3.2.2无锁队列

本文探讨了无锁队列在高并发场景下的应用,介绍了循环数组无锁队列和链表无锁队列的实现细节,包括入队、出队操作,并分析了ZMQ的无锁队列实现,强调了线程安全和内存管理策略。

无锁队列使用场景

至少每秒十几万读写才考虑使用,否则没有意义

循环数组无锁队列实现

这个队列结构简单,有大小上限,可以适用于多写多读的情况
接口

bool enqueue(const ELEM_T &a_data); // ⼊队列 
bool dequeue(ELEM_T &a_data); // 出队列 bool 
try_dequeue(ELEM_T &a_data); // 尝试⼊队列

成员

ELEM_T m_thequeue[Q_SIZE]; 
volatile QUEUE_INT m_count; // 队列的元素格式 
volatile QUEUE_INT m_writeIndex;//新元素⼊列时存放位置在数组中的下标 
volatile QUEUE_INT m_readIndex;//第一个有效数据
volatile QUEUE_INT m_maximumReadIndex; //指向第一个不能读取的数据(可能无效,可能正在写入)
//即[m_readIndex, m_maximumReadIndex)是可读的数据
inline QUEUE_INT countToIndex(QUEUE_INT a_count);

队列已满判断:(m_writeIndex + 1) %Q_SIZE == m_readIndex

队列为空判断:m_readIndex == m_maximumReadIndex

入队


                
以下是个用于启动和停止 Hadoop 3.2.2 的 Bash 脚本示例及其详细解释: ```bash #!/bin/bash # 设置 Hadoop 家目录 HADOOP_HOME=/opt/modules/hadoop-3.2.2 # 定义启动 Hadoop 的函数 start_hadoop() { # 启动 Hadoop 的 NameNode、DataNode 和 SecondaryNameNode $HADOOP_HOME/sbin/start-dfs.sh # 启动 YARN 的 ResourceManager 和 NodeManager $HADOOP_HOME/sbin/start-yarn.sh # 启动 JobHistoryServer $HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver echo "Hadoop 3.2.2 已成功启动。" } # 定义停止 Hadoop 的函数 stop_hadoop() { # 停止 JobHistoryServer $HADOOP_HOME/sbin/mr-jobhistory-daemon.sh stop historyserver # 停止 YARN 的 ResourceManager 和 NodeManager $HADOOP_HOME/sbin/stop-yarn.sh # 停止 Hadoop 的 NameNode、DataNode 和 SecondaryNameNode $HADOOP_HOME/sbin/stop-dfs.sh echo "Hadoop 3.2.2 已成功停止。" } # 解析命令行参数 case "$1" in start) start_hadoop ;; stop) stop_hadoop ;; *) echo "用法: $0 {start|stop}" exit 1 ;; esac ``` ### 代码逻辑解释 1. **环境变量设置**: ```bash HADOOP_HOME=/opt/modules/hadoop-3.2.2 ``` 此代码行设置了 Hadoop 的家目录,后续脚本中的命令将基于该目录执行。这与配置 Hadoop 环境变量时设置的 `HADOOP_HOME` 致[^1]。 2. **启动 Hadoop 函数**: ```bash start_hadoop() { $HADOOP_HOME/sbin/start-dfs.sh $HADOOP_HOME/sbin/start-yarn.sh $HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver echo "Hadoop 3.2.2 已成功启动。" } ``` - `$HADOOP_HOME/sbin/start-dfs.sh`:该命令用于启动 Hadoop 的分布式文件系统(HDFS),包括 NameNode、DataNode 和 SecondaryNameNode。 - `$HADOOP_HOME/sbin/start-yarn.sh`:此命令用于启动 YARN(Yet Another Resource Negotiator),包括 ResourceManager 和 NodeManager。 - `$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver`:该命令用于启动 JobHistoryServer,它可以记录和展示 MapReduce 作业的历史信息[^3]。 3. **停止 Hadoop 函数**: ```bash stop_hadoop() { $HADOOP_HOME/sbin/mr-jobhistory-daemon.sh stop historyserver $HADOOP_HOME/sbin/stop-yarn.sh $HADOOP_HOME/sbin/stop-dfs.sh echo "Hadoop 3.2.2 已成功停止。" } ``` - `$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh stop historyserver`:停止 JobHistoryServer。 - `$HADOOP_HOME/sbin/stop-yarn.sh`:停止 YARN 的 ResourceManager 和 NodeManager。 - `$HADOOP_HOME/sbin/stop-dfs.sh`:停止 HDFS 的 NameNode、DataNode 和 SecondaryNameNode。 4. **命令行参数解析**: ```bash case "$1" in start) start_hadoop ;; stop) stop_hadoop ;; *) echo "用法: $0 {start|stop}" exit 1 ;; esac ``` - `case` 语句用于根据命令行的第个参数来决定执行哪个操作。 - 如果参数是 `start`,则调用 `start_hadoop` 函数启动 Hadoop。 - 如果参数是 `stop`,则调用 `stop_hadoop` 函数停止 Hadoop。 - 如果参数不是 `start` 或 `stop`,则输出使用说明并以错误码 1 退出脚本。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值