限制一个线程读,一个线程写,不加锁的队列,使用单链表实现,测试环境:centos 5.9

[root@localhost test]# cat  test.cpp

#include <iostream>
#include <pthread.h>template<class QElmType>
struct qnode
{struct qnode *next;QElmType data;
};
template<class QElmType>
class queue
{
public:queue() {init();}~queue() {destroy();}bool init(){m_front = m_rear = new qnode<QElmType>;if (!m_front)return false;m_front->next = 0;return true;}void destroy(){while (m_front){m_rear = m_front->next;delete m_front;m_front = m_rear;}}bool push(QElmType e){struct qnode<QElmType> *p = new qnode<QElmType>;if (!p)return false;p->next = 0;m_rear->next = p;m_rear->data = e;m_rear = p;return true;}bool pop(QElmType *e){if (m_front == m_rear)return false;struct qnode<QElmType> *p = m_front;*e = p->data;m_front = p->next;delete p;return true;}
private:struct qnode<QElmType> * volatile m_front, * volatile m_rear;
};queue<int> g_q;void *thread1(void * l)
{int i = 0;while (1){g_q.push(i);i++;usleep(::rand()%1000);}return 0;
}
void *thread2(void * l)
{int i;while (1){if (g_q.pop(&i))std::cout << i << std::endl;//else//std::cout << "can not pop" << std::endl;usleep(::rand()%1000);}return 0;
}int main(int argc, char* argv[])
{pthread_t t1,t2;pthread_create(&t1, 0, thread1, 0);pthread_create(&t2, 0, thread2, 0);char ch;while (1){std::cin >> ch;if (ch == 'q')break;}return 0;
}

代码比较简单,只实现2个线程间的无锁。

这个无锁队列主要是使用两个volatile 的指针来判断是否还有任务( volatile m_front, * volatile m_rear)。

只能实现两个线程间的无锁队列,一个是工作者线程一个是提供任务线程,因为不能让两个或以上的线程来修改指针m_front 和指针m_rear,否者会出现问题。

这个无锁队列的实现是基于m_front指针的修改是由一个线程来完成的,m_rear的修改是由另一个线程来完成的,不会出现同时两个线程修改同一个指针。

一读一写无锁队列c++实现相关推荐

  1. 实用的无锁队列(一)

    写一个无锁队列的好处 针对应用场景写无锁队列好处是能够得到额外的cpu释放 1. atomic_thread_fence C++11的原子库标准定义了一个可移植的函数atomic_thread_fen ...

  2. 你应该知道的高性能无锁队列Disruptor

    1.何为队列 听到队列相信大家对其并不陌生,在我们现实生活中队列随处可见,去超市结账,你会看见大家都会一排排的站得好好的,等待结账,为什么要站得一排排的,你想象一下大家都没有素质,一窝蜂的上去结账,不 ...

  3. gitclone 一个tag的地址_一个无锁队列和FreeList实现

    代码实现了这篇文章中的无锁队列. fangcun:简单,高效,实用的非阻塞(无锁)和阻塞并行队列算法​zhuanlan.zhihu.com 无锁队列需要实现一个FreeList来避免一个线程释放了结点 ...

  4. 【高并发】多线程之无锁队列|性能优化

    队列操作模型 (1)单生产者--单消费者 (2)多生产者--单消费者 (3)单生产者--多消费者 (4)多生产者--多消费者 3.队列数据定长与变长 (1)队列数据定长 (2)队列数据变长 并发无锁处 ...

  5. 无锁队列原理及实现(一)

    背景 在进行实际生产多线程开发的时候通常不会直接使用使用锁机制来操作线程间传递的数据,特别是对效率要求很高的场景中.最典型的就是音视频项目或者网络项目.这里先拿网络传输场景举例, 从这篇开始就开始详细 ...

  6. 无锁队列原理及实现(二)

    环形队列 Ring Buffer 上一篇降到了环形队列的一些性质.现在来说实现. 从需求开看环形队列需要进行两个操作 写入 读取 而作为一个大小有限内存区域,就会有临界状态来限制置否能写入成功,或者是 ...

  7. 无锁CAS及无锁队列实现

    CAS ⽐较并交换(compare and swap, CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据 交换操作,从⽽避免多线程同时改写某⼀数据时由于执⾏顺序不确定性以及中断的不可 ...

  8. ZMQ无锁队列的原理与实现

    ZMQ无锁队列的原理与实现 前言 1. 为什么需要⽆锁队列 2. 无锁队列的实现(参考zmq,只支持一写一读的场景) 2.1 无锁队列前言 2.2 原⼦操作函数介绍 2.3 yqueue_t的chun ...

  9. 无锁队列的几种实现及其性能对比

    一.无锁队列用在什么样的场景? 当需要处理的数据非常多,比如行情数据,一秒处理非常多的数据的时候,可以考虑用无锁队列.但是如果一秒只需要处理几百或者几千的数据,是没有必要考虑用无锁队列的.用互斥锁就能 ...

最新文章

  1. java:数组的默认值
  2. 记一次因坏块引起的dataguard恢复
  3. Leetcode 226. 翻转二叉树 (每日一题 20210819)
  4. java学习类的笔记
  5. 金融贷款逾期的模型构建5——数据预处理
  6. 设计模式之装饰模式的学习
  7. PHP的Composer:命令 符号 区别
  8. Kruscal算法+并查集 求解最小生成树
  9. 管理本地多个SSH Key
  10. (Oracle)关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案...
  11. Python实现cmd命令连续执行
  12. 分享一位电商大佬的技术笔记
  13. Unity3D之Material(材质、着色器、纹理)
  14. 吴恩达“旗下”Drive.ai无人出租车来了!新硬件成本更低,外挂4块屏幕
  15. 每日算法系列【LeetCode 1186】删除一次得到子数组最大和
  16. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_14_注解_自定义注解_格式本质...
  17. 投资组合报告-马科维茨模型
  18. 【图片resize】图片三种缩放方式/letterbox_image实现
  19. 漫游测试之性能测试(5.5-查询设计)
  20. 信息安全快讯丨夏末秋初,正是阅读好时光

热门文章

  1. 【电商】电商后台设计—优惠券
  2. apt攻击基础知识的整理
  3. HalconOCR助手
  4. Linux Rsync 安装和配置
  5. Fast-planner代码阅读2-TopoReplan (path searchiing部分)
  6. SSH第一步:让自己的程序跑起来
  7. php中让不显示某一列,excel中a列不见了怎么办
  8. 【笨嘴拙舌WINDOWS】SetCapture和ReleaseCapture
  9. php 电子耗材管理系统,PHPOA协同OA系统协助办公用品管理
  10. QQ音乐for mac~下载歌曲到本地