当前位置:软件学习 > 其它软件 >>

多线程的那点儿事(之无锁队列)

 

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

 

 

 

 

     对于编写多线程的朋友来说,队列具有天生的互斥性。在队列里面,一个负责添加数据,一个负责处理数据。谁也不妨碍谁,谁也离不开谁。所以,队列具有天生的并行性。

 

 

#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;  

#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;     此时,一个线程压入数据,操作为push_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 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;

}    那么,还有一个线程就负责处理数据pop_data,

 

 

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; 

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只有在计算结束之前的时候才能进行自增运算

补充:软件开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,