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

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

 更新時(shí)間:2016年07月07日 17:33:38   投稿:lqh  
本文主要是介紹 C語(yǔ)言實(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是寫(xiě)指針下標(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í)際寫(xiě)入的字節(jié)數(shù)也全為0。另一種邊界情況是當(dāng)len很大時(shí)(因?yàn)閘en是無(wú)符號(hào)的,負(fù)數(shù)對(duì)它來(lái)說(shuō)也是一個(gè)很大的正數(shù)),這一句也能保證len取到一個(gè)較小的值,因?yàn)閒ifo->in總是大于等于fifo->out,所以后面的那個(gè)表達(dá)式的值不會(huì)超過(guò)fifo->size的大小把上一步?jīng)Q定的要寫(xiě)入的字節(jié)數(shù)len“切開(kāi)”,這里又使用了一個(gè)技巧。注意:實(shí)際分配給fifo->buffer的字節(jié)數(shù)fifo->size,必須是2的冪,否則這里就會(huì)出錯(cuò)。既然fifo->size是2的冪,那么 (fifo->size-1)也就是一個(gè)后面幾位全為1的數(shù),也就能保證(fifo->in & (fifo->size - 1))總為不超過(guò)(fifo->size - 1)的那一部分,和(fifo->in)% (fifo->size - 1)的效果一樣。 

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

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

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

相關(guān)文章

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

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

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言零基礎(chǔ)入門(mén)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    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語(yǔ)言程序環(huán)境編譯+鏈接理論

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

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

    C語(yǔ)言利用面試真題理解指針的使用

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

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

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

    C語(yǔ)言文件操作零基礎(chǔ)新手入門(mén)保姆級(jí)教程

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

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

    這篇文章主要介紹了C語(yǔ)言之實(shí)現(xiàn)字符串小寫(xiě)變大寫(xiě)的實(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é)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C++解決大數(shù)組棧內(nèi)存不夠問(wèn)題的方法分析

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

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

最新評(píng)論

宿州市| 伊宁县| 巩义市| 桃园市| 河东区| 银川市| 恭城| 仙桃市| 保德县| 溧阳市| 丰都县| 萨嘎县| 邹城市| 宽甸| 祁东县| 德格县| 班戈县| 青海省| 岳普湖县| 花垣县| 老河口市| 花莲县| 黔江区| 江口县| 射阳县| 体育| 延川县| 丰城市| 肥西县| 明光市| 沧州市| 瓮安县| 武邑县| 海口市| 定南县| 汉阴县| 柳州市| 安国市| 通江县| 望奎县| 临沧市|