无锁队列(转)

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

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

}

那么,还有一个线程就负责处理数据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;

}

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

posted @ 2012-08-15 16:35  SA高处不胜寒  阅读(1024)  评论(0编辑  收藏  举报