最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C 語言中實(shí)現(xiàn)環(huán)形緩沖區(qū)

 更新時(shí)間:2016年07月07日 17:33:38   投稿:lqh  
本文主要是介紹 C語言實(shí)現(xiàn)環(huán)形緩沖區(qū),并附有詳細(xì)實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,希望能幫助有需要的小伙伴

1.實(shí)現(xiàn)代碼:

#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指向存放數(shù)據(jù)的緩沖區(qū),size是緩沖區(qū)的大小,in是寫指針下標(biāo),out是讀指針下標(biāo),在len和(fifo->size - fifo->in + fifo->out)之間取一個(gè)較小的值賦給len。注意,當(dāng)(fifo->in == fifo->out+fifo->size)時(shí),表示緩沖區(qū)已滿,此時(shí)得到的較小值一定是0,后面實(shí)際寫入的字節(jié)數(shù)也全為0。另一種邊界情況是當(dāng)len很大時(shí)(因?yàn)閘en是無符號的,負(fù)數(shù)對它來說也是一個(gè)很大的正數(shù)),這一句也能保證len取到一個(gè)較小的值,因?yàn)閒ifo->in總是大于等于fifo->out,所以后面的那個(gè)表達(dá)式的值不會超過fifo->size的大小把上一步?jīng)Q定的要寫入的字節(jié)數(shù)len“切開”,這里又使用了一個(gè)技巧。注意:實(shí)際分配給fifo->buffer的字節(jié)數(shù)fifo->size,必須是2的冪,否則這里就會出錯(cuò)。既然fifo->size是2的冪,那么 (fifo->size-1)也就是一個(gè)后面幾位全為1的數(shù),也就能保證(fifo->in & (fifo->size - 1))總為不超過(fifo->size - 1)的那一部分,和(fifo->in)% (fifo->size - 1)的效果一樣。 

 2.這樣后面的代碼就不難理解了,它先向fifo->in到緩沖區(qū)末端這一塊寫數(shù)據(jù),如果還沒寫完,在從緩沖區(qū)頭開始寫入剩下的,從而實(shí)現(xiàn)了循環(huán)緩沖。最后,把寫指針后移len個(gè)字節(jié),并返回len。

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

 以上就是環(huán)形緩沖區(qū)域的C語言實(shí)現(xiàn)詳解,希望對大家有所幫助,謝謝支持!

相關(guān)文章

  • C++的數(shù)據(jù)共享與保護(hù)你了解嗎

    C++的數(shù)據(jù)共享與保護(hù)你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語言零基礎(chǔ)入門的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 淺析c與c++中struct的區(qū)別

    淺析c與c++中struct的區(qū)別

    c與c++中struct的區(qū)別你是否了解,下面小編就詳細(xì)的為大家介紹一下
    2013-07-07
  • C++實(shí)現(xiàn)推箱子小游戲源碼

    C++實(shí)現(xiàn)推箱子小游戲源碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)推箱子小游戲源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C語言程序環(huán)境編譯+鏈接理論

    C語言程序環(huán)境編譯+鏈接理論

    這篇文章主要介紹了C語言程序環(huán)境編譯+鏈接理論,下面文章基于C語言的相關(guān)資料展開對編譯和鏈接的詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • C語言利用面試真題理解指針的使用

    C語言利用面試真題理解指針的使用

    C語言這門課程在計(jì)算機(jī)的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語言的學(xué)習(xí),對指針的掌握是非常重要的,本文將具體針對指針的基礎(chǔ)做詳盡的介紹
    2022-08-08
  • linux下使用g++編譯cpp工程的方法

    linux下使用g++編譯cpp工程的方法

    這篇文章主要介紹了linux下使用g++編譯cpp工程的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C語言文件操作零基礎(chǔ)新手入門保姆級教程

    C語言文件操作零基礎(chǔ)新手入門保姆級教程

    在實(shí)際應(yīng)用中,我們往往需要對文件進(jìn)行操作,下面這篇文章主要給大家分享了關(guān)于C語言文件操作的零基礎(chǔ)新手入門保姆級教程,文中通過示例代碼以及圖片介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • C語言之實(shí)現(xiàn)字符串小寫變大寫的實(shí)例

    C語言之實(shí)現(xiàn)字符串小寫變大寫的實(shí)例

    這篇文章主要介紹了C語言之實(shí)現(xiàn)字符串小寫變大寫的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++數(shù)組放在main函數(shù)內(nèi)外的區(qū)別

    C++數(shù)組放在main函數(shù)內(nèi)外的區(qū)別

    大家好,本篇文章主要講的是C++數(shù)組放在main函數(shù)內(nèi)外的區(qū)別,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++解決大數(shù)組棧內(nèi)存不夠問題的方法分析

    C++解決大數(shù)組棧內(nèi)存不夠問題的方法分析

    這篇文章主要介紹了C++解決大數(shù)組棧內(nèi)存不夠問題的方法,結(jié)合實(shí)例形式對比分析了C++針對大數(shù)組棧內(nèi)存不足情況的常見解決方法及其優(yōu)缺點(diǎn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2018-05-05

最新評論

宝丰县| 石河子市| 伊吾县| 青阳县| 兰考县| 榆社县| 苍溪县| 东辽县| 枣阳市| 汉沽区| 霍山县| 格尔木市| 龙江县| 井冈山市| 祥云县| 吉木乃县| 安国市| 廊坊市| 长岭县| 宝应县| 海门市| 河津市| 榆林市| 麦盖提县| 克拉玛依市| 台湾省| 宜良县| 黄石市| 闸北区| 天津市| 兴仁县| 新密市| 石景山区| 望谟县| 鸡东县| 富民县| 翁牛特旗| 八宿县| 化德县| 武宁县| 罗江县|