多线程之无锁队列

1. 什么是无锁队列

字面意思理解,就是两个线程同步操作某种数据时,不能加锁;
因为加锁是会拖慢效率,造成延时的;

2. 什么场景需要用到无锁队列呢?

最典型的是生产者和消费者模型,要求生产者生产的同时,进行消费,这就要求足够的低延时,此时可以使用无锁队列;
比如:
线程A生产 1,2,3,4...
线程B对生产出来的数相加,要求效率足够高,不能用锁,此时就可以用无锁队列。

3. 无锁队列的实现

#define MAX_NUMBER 1000
#define OK 0
#define ERROR -1

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

QUEUE_DATA* pHead = new QUEUE_DATA;
pHead->head = 0;
pHead->tail = 0;

//从队尾加入数据,队列是一个环形队列
int push_data(QUEUE_DATA* pHead, int data)
{
 if ( pHead == NULL || (pHead->head == ((pHead->tail +1) % MAX_NUMBER) ) )
 {
  return ERROR;
 }
 pHead->iData[pHead->tail] = data;
 pHead->tail = (pHead->tail+1)%MAX_NUMBER;
 return OK;
}

int pop_data(QUEUE_DATA* pHead)
{
 if (pHead == NULL || (pHead->head == pHead->tail))
 {
  return ERROR;
 }
 pHead->iData[pHead->head] = 0;
 pHead->head = (pHead->head+1)%MAX_NUMBER;
 return OK;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java平台类库包含了丰富的并发基础构建模块,例如线程安全的容器类以及各种用于协调多个相互协作的线程控制流的同步工...
    Steven1997阅读 607评论 0 0
  • Java-Review-Note——4.多线程 标签: JavaStudy PS:本来是分开三篇的,后来想想还是整...
    coder_pig阅读 1,772评论 2 17
  • Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么? 1...
    AlanGe阅读 1,920评论 0 17
  • Q:为什么出现多线程? A:为了实现同时干多件事的需求(并发),同时进行着下载和页面UI刷新。对于处理器,为每个线...
    幸福相依阅读 1,721评论 0 2
  • 曾在宿舍楼里低质量的电梯里蹦过 被困住了 虽然被救出去了 但是坐电梯的时候 偶尔会想 会不会在我走出电梯的一刹那 ...
    九了九了九阅读 228评论 0 0

友情链接更多精彩内容