多线程编程之无锁队列

关于无锁队列的概念与实现,可以参考博文《无锁队列的实现》,主要涉及到的知识点包括CAS原子操作、无锁队列的链表实现、无锁队列的数组实现以及ABA问题。

  下面借鉴了《多线程的那点儿事(之无锁队列)》的代码,说明两个线程(一个添加一个读取数据)之间的无锁队列,可以不借助线程互斥方法就能够达到并行效果。代码如下:

#define MAX_NUMBER 1000L
#define STATUS int
#define OK     0
#define FALSE -1

typedef struct _QUEUE_DATA
{
    int data[MAX_NUMBER];
    int head;
    int tail;
}QUEUE_DATA; 

STATUS push_data(QUEUE_DATA* pQueue, int data)
{
    if(NULL == pQueue)
        return ERROR;

    if(pQueue->head == ((pQueue->tail) + 1)% MAX_NUMBER)
        return ERROR;

    pQueue->data[pQueue->tail] = data;
    pQueue->tail = (pQueue->tail + 1)% MAX_NUMBER;
    return OK;
}

STATUS pop_data(QUEUE_DATA* pQueue, int* pData)
{
    if(NULL == pQueue || NULL == pData)
        return ERROR;

    if(pQueue->head == pQueue->tail)
        return ERROR;

    *pData = pQueue->data[pQueue->head];
    pQueue->head = (pQueue->head + 1)% MAX_NUMBER;
    return OK;
}

  

小结:

  1. 无锁队列只适合两个线程并行使用,一个压入数据,一个弹出数据
  2. 无锁队列是没有锁的并行,没有死锁的危险
  3. 无锁队列中head和tail只有在计算结束之前的时候才能进行自增运算

转载于:https://www.cnblogs.com/cyyljw/p/8006855.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值