国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C 語言中實現環形緩沖區

2020-01-26 14:31:12
字體:
來源:轉載
供稿:網友

1.實現代碼:

#include #include #include #include #include #define BUFFSIZE 1024 * 1024 #define min(x, y) ((x) < (y) ? (x) : (y)) pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; struct cycle_buffer {  unsigned char *buf;  unsigned int size;  unsigned int in;  unsigned int out;  pthread_mutex_t lock; }; static struct cycle_buffer *fifo = NULL; static int init_cycle_buffer(void) { int size = BUFFSIZE, ret;  ret = size & (size - 1);  if (ret)   return ret; fifo = (struct cycle_buffer *) malloc(sizeof(struct cycle_buffer));  if (!fifo)   return -1;  memset(fifo, 0, sizeof(struct cycle_buffer));  fifo->size = size;  fifo->in = fifo->out = 0;  pthread_mutex_init(&fifo->lock, NULL);  fifo->buf = (unsigned char *) malloc(size);  if (!fifo->buf)  free(fifo); else  memset(fifo->buf, 0, size);  return 0; } unsigned int fifo_get(unsigned char *buf, unsigned int len) {  unsigned int l;  len = min(len, fifo->in - fifo->out);  l = min(len, fifo->size - (fifo->out & (fifo->size - 1)));  memcpy(buf, fifo->buf + (fifo->out & (fifo->size - 1)), l);  memcpy(buf + l, fifo->buf, len - l);  fifo->out += len;  return len; } unsigned int fifo_put(unsigned char *buf, unsigned int len) {  unsigned int l;  len = min(len, fifo->size - fifo->in + fifo->out);  l = min(len, fifo->size - (fifo->in & (fifo->size - 1)));  memcpy(fifo->buf + (fifo->in & (fifo->size - 1)), buf, l);  memcpy(fifo->buf, buf + l, len - l);  fifo->in += len;  return len; } static void * thread_read(void *arg) {  char buf[1024];  unsigned int n;  pthread_detach(pthread_self());  for (;;) {   memset(buf, 0, sizeof(buf));   pthread_mutex_lock(&fifo->lock);   n = fifo_get(buf, sizeof(buf));   pthread_mutex_unlock(&fifo->lock);   write(STDOUT_FILENO, buf, n);  } printf("nnafter thread_read : %snn",buf); return NULL; } static void * thread_write(void *arg) {  unsigned char buf[] = "hello world";  pthread_detach(pthread_self());  for (;;) {   pthread_mutex_lock(&fifo->lock);   fifo_put(buf, strlen(buf));   pthread_mutex_unlock(&fifo->lock);  }  return NULL; } int main(void) {  int ret;  pthread_t wtid, rtid;  ret = init_cycle_buffer();  if (ret == -1)   return ret;  pthread_create(&wtid, NULL, thread_write, NULL);  pthread_create(&rtid, NULL, thread_read, NULL);  pthread_exit(NULL);  return 0;}

1.buffer指向存放數據的緩沖區,size是緩沖區的大小,in是寫指針下標,out是讀指針下標,在len和(fifo->size - fifo->in + fifo->out)之間取一個較小的值賦給len。注意,當(fifo->in == fifo->out+fifo->size)時,表示緩沖區已滿,此時得到的較小值一定是0,后面實際寫入的字節數也全為0。另一種邊界情況是當len很大時(因為len是無符號的,負數對它來說也是一個很大的正數),這一句也能保證len取到一個較小的值,因為fifo->in總是大于等于fifo->out,所以后面的那個表達式的值不會超過fifo->size的大小把上一步決定的要寫入的字節數len“切開”,這里又使用了一個技巧。注意:實際分配給fifo->buffer的字節數fifo->size,必須是2的冪,否則這里就會出錯。既然fifo->size是2的冪,那么 (fifo->size-1)也就是一個后面幾位全為1的數,也就能保證(fifo->in & (fifo->size - 1))總為不超過(fifo->size - 1)的那一部分,和(fifo->in)% (fifo->size - 1)的效果一樣。 

 2.這樣后面的代碼就不難理解了,它先向fifo->in到緩沖區末端這一塊寫數據,如果還沒寫完,在從緩沖區頭開始寫入剩下的,從而實現了循環緩沖。最后,把寫指針后移len個字節,并返回len。

 3.從上面可以看出,fifo->in的值可以從0變化到超過fifo->size的數值,fifo->out也如此,但它們的差不會超過fifo->size 。

 以上就是環形緩沖區域的C語言實現詳解,希望對大家有所幫助,謝謝支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 清新县| 天峻县| 孟州市| 方城县| 阿拉善盟| 监利县| 兖州市| 深泽县| 永新县| 巴东县| 宣化县| 崇明县| 响水县| 章丘市| 新密市| 比如县| 县级市| 兴海县| 彝良县| 浦东新区| 双峰县| 丰宁| 寻乌县| 留坝县| 左云县| 惠安县| 旺苍县| 甘肃省| 思茅市| 漳州市| 长子县| 西林县| 北碚区| 利辛县| 商南县| 垣曲县| 石楼县| 台北县| 石楼县| 米泉市| 桑日县|