zoukankan      html  css  js  c++  java
  • 多线程编程之无锁队列

    关于无锁队列的概念与实现,可以参考博文《无锁队列的实现》,主要涉及到的知识点包括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只有在计算结束之前的时候才能进行自增运算
  • 相关阅读:
    Rolling Hash(Rabin-Karp算法)匹配字符串
    vim下单行长文本的时候卡顿解决办法
    设置vim的默认工作路径同时与自动设当前编辑的文件所在目录为当前工作路径不冲突
    Careercup
    Careercup
    Careercup
    Careercup
    Careercup
    Careercup
    Careercup
  • 原文地址:https://www.cnblogs.com/cyyljw/p/8006855.html
Copyright © 2011-2022 走看看