单生产者单消费者模式的无锁队列实现
来源:互联网 发布:vb 鼠标穿透 编辑:程序博客网 时间:2024/04/28 03:25
#ifndef FIFO_H#define FIFO_Hstruct FIFO{ void **buffer; unsigned int size; unsigned int in; unsigned int out;};struct FIFO *FIFO_alloc(unsigned int size);unsigned int FIFO_put(struct FIFO *FIFO, void** obj_table, unsigned int n);unsigned int FIFO_get(struct FIFO *FIFO, void** obj_table, unsigned int len);#endif // FIFO_H
#include "fifo.h"#include <stdio.h>#include <stdlib.h>#include <math.h>#define min(a, b) ((a) > (b))?(b):(a)#define max(a, b) ((a) > (b))?(a):(b)#ifdef CONFIG_X86_32/*指令“lock; addl $0,0(%%esp)”表示加锁,把0加到栈顶的内存单元,该指令操作本身无意义,但这些指令起到内存屏障的作用,让前面的指令执行完成。具有XMM2特征的CPU已有内存屏障指令,就直接使用该指令*/#define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2)#define rmb() alternative("lock; addl $0,0(%%esp)", "lfence", X86_FEATURE_XMM2)#define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", X86_FEATURE_XMM)#else#define mb() asm volatile("mfence":::"memory")#define rmb() asm volatile("lfence":::"memory")#define wmb() asm volatile("sfence" ::: "memory")#endifstatic inline int fls(int x){ int r; __asm__("bsrl %1,%0\n\t" "jnz 1f\n\t" "movl $-1,%0\n" "1:" : "=r" (r) : "rm" (x)); return r+1;}static inline unsigned int roundup_pow_of_two(unsigned int x){ return 1UL << fls(x - 1);}struct FIFO *FIFO_alloc(unsigned int size){ struct FIFO *ret = (struct FIFO*)malloc(sizeof(struct FIFO)); if (size & (size - 1)) { size = roundup_pow_of_two(size); } ret->buffer = (void**)malloc(size*sizeof(void*)); ret->size = size; if (!ret->buffer) { return NULL; } memset(ret->buffer, 0, size*sizeof(void*)); ret->in = 0 ; ret->out = 0; return ret;}unsigned int FIFO_put(struct FIFO *FIFO, void** obj_table, unsigned int n){ unsigned int l; unsigned int len; unsigned int i, nCount, nIndex; len = min(n, FIFO->size - FIFO->in + FIFO->out); mb(); l = min(len, FIFO->size - (FIFO->in & (FIFO->size - 1))); nCount = l; nIndex = FIFO->in & (FIFO->size - 1); for(i=0; i<nCount; i++) { FIFO->buffer[nIndex + i] = obj_table[i]; } nCount = len-l; for(i=0; i<nCount; i++) { FIFO->buffer[i] = obj_table[l+ i]; } wmb(); FIFO->in += len; return len;}unsigned int FIFO_get(struct FIFO *FIFO, void** obj_table, unsigned int len){ unsigned int l; unsigned int nCount, nIndex; unsigned int i; len = min(len, FIFO->in - FIFO->out); rmb(); l = min(len, FIFO->size - (FIFO->out & (FIFO->size - 1))); nCount = l; nIndex = FIFO->out & (FIFO->size - 1); for(i=0; i<nCount; i++) { obj_table[i] = FIFO->buffer[nIndex + i]; } nIndex = nCount; nCount = len - l; for(i=0; i<nCount; i++) { obj_table[nIndex + i] = FIFO->buffer[i]; } mb(); FIFO->out += len; return len;}
0 0
- 单生产者单消费者模式的无锁队列实现
- 单生产者,单消费者无锁队列实现(c)
- 单生产者单消费者循环无锁队列
- 无锁队列之单生产者单消费者
- 并发无锁队列UnlockQueue(单生产者单消费者kfifo)
- 并发无锁队列学习(单生产者单消费者模型)
- 并发无锁队列学习之二【单生产者单消费者】
- 基于环形队列的单生产者单消费者模型
- 单生产者 单消费者情景下 无锁仓库
- 阻塞队列实现的生产者/消费者模式
- 单生产者,单消费者
- 单生产者 单消费者
- 关于单线程生产者消费者模式的一些记录
- java多生产者,单消费者实现
- 单生产者-单消费者模型
- 单生产者 多消费者
- C++11完成单生产者单消费者模式
- 一个生产者一个消费者的无锁队列,多个生产者多个消费者的无锁队列
- 文件输入输出流
- 网盘生意不好做,论坛也类似
- 快速解决低版本Xcode不支持高版本iOS真机调试问题
- C语言使用宏定义可以防止出错,提高可移植性,可读性,方便性
- 设置Android SDK代理 转自:http://mirrors.neusoft.edu.cn
- 单生产者单消费者模式的无锁队列实现
- 计算机视觉-相机内参数和外参数
- JavaWeb请求-响应学习笔记
- /bin/bash^M
- [snmpsim] Simulation based on MIB files 基于MIB文件的模拟
- UVA 11389 The Bus Driver Problem .
- SSO之CAS单点登录1
- MyEclipse2015导入java项目出错setting build path has encountered a problem
- 第九周 OJ 等比数列