• 多线程编程之无锁队列


    关于无锁队列的概念与实现,可以参考博文《无锁队列的实现》,主要涉及到的知识点包括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只有在计算结束之前的时候才能进行自增运算
  • 相关阅读:
    better-scroll 介绍
    promise 异步编程
    vue网址路由的实时检测
    浏览器本地存储的使用
    获取元素的位置
    如何设置动画的运动效果
    实现对称加密及非对称公钥加密
    Centos 7系统启动修复
    Centos 7服务启动文件
    内核编译-4.12
  • 原文地址:https://www.cnblogs.com/cyyljw/p/8006855.html
Copyright © 2020-2023  润新知