国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言環形隊列的原理和特點

strongerHuang ? 來源:嵌入式Linux ? 作者:寫代碼的籃球球癡 ? 2021-05-11 13:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

什么是環形隊列?

環形緩沖區是一個非常典型的數據結構,這種數據結構符合生產者,消費者模型,可以理解它是一個水坑,生產者不斷的往里面灌水,消費者就不斷的從里面取出水。

那就可能會有人問,既然需要灌水,又需要取出水,為什么還需要開辟一個緩沖區內存空間呢?直接把生產者水管的尾部接到消費者水管的頭部不就好了,這樣可以省空間啊。

答案是不行的,生產者生產水的速度是不知道的,消費者消費水的速度也是不知道的,如果你強制接在一起,因為生產和消費的速度不同,就非常可能存在水管爆炸的情況,你說這樣危險不危險?

音頻系統框架下,alsa就是使用環形隊列的,在生產者和消費者速度不匹配的時候,就會出現xrun的問題。

環形隊列的特點

1、數組構造環形緩沖區

假設我們用數組來構造一個環形緩存區,如下圖

59134ccc-b20d-11eb-bf61-12bb97331649.png

我們需要幾個東西來形容這個環形緩沖區,一個的讀位置,一個是寫位置,一個是環形緩沖區的長度

5928e3fc-b20d-11eb-bf61-12bb97331649.png

從圖片看,我們知道,這個環形緩沖區的讀寫位置是指向數組的首地址的,環形緩沖區的長度是 5 。

那如何判斷環形緩沖區為空呢?

如果 R == W 就是讀寫位置相同,則這個環形緩沖區為空

那如何判斷環形緩沖區滿了呢?

如果 (W - R )= Len ,則這個環形緩沖區已經滿了。

2、向環形緩沖區寫入 3個數據

寫入 3 個數據后,W 的值等于 3 了,R 還是等于 0。

3個企鵝已經排列

3、從環形緩沖區讀取2個數據

讀出兩個數據后,R = 2 了,這個時候,W還是等于 3,畢竟沒有再寫過數據了。

4、再寫入3個數據

如果 W 》 LEN 后,怎么找到最開始的位置的呢?這個就需要進行運算了,W%LEN 的位置就是放入數據的位置 ,6%5 = 1。

5、再寫入1個數據

這個時候環形隊列已經滿了,要是想再寫入數據的話,就不行了,(W - R) = 5 == LEN

代碼實現

/* 實現的最簡單的ringbuff 有更多提升空間,可以留言說明 */

#include “stdio.h”

#include “stdlib.h”

#define LEN 10

/*環形隊列結構體*/

typedef struct ring_buff{

int array[LEN];

int W;

int R;

}*ring;

/*環形隊列初始化*/

struct ring_buff * fifo_init(void)

{

struct ring_buff * p = NULL;

p = (struct ring_buff *)malloc(sizeof(struct ring_buff));

if(p == NULL)

{

printf(“fifo_init malloc error

”);

return NULL;

}

p-》W = 0;

p-》R = 0;

return p;

}

/*判斷環形隊列是否已經滿了*/

int get_ring_buff_fullstate(struct ring_buff * p_ring_buff)

{

/*如果寫位置減去讀位置等于隊列長度,就說明這個環形隊列已經滿*/

if((p_ring_buff-》W - p_ring_buff-》R) == LEN)

{

return (1);

}

else

{

return (0);

}

}

/*判斷環形隊列為空*/

int get_ring_buff_emptystate(struct ring_buff * p_ring_buff)

{

/*如果寫位置和讀的位置相等,就說明這個環形隊列為空*/

if(p_ring_buff-》W == p_ring_buff-》R)

{

return (1);

}

else

{

return (0);

}

}

/*插入數據*/

int ring_buff_insert(struct ring_buff * p_ring_buff,int data)

{

if(p_ring_buff == NULL)

{

printf(“p null

”);

return (-1);

}

if(get_ring_buff_fullstate(p_ring_buff) == 1)

{

printf(“buff is full

”);

return (-2);

}

p_ring_buff-》array[p_ring_buff-》W%LEN] = data;

p_ring_buff-》W ++;

//printf(“inset:%d %d

”,data,p_ring_buff-》W);

return (0);

}

/*讀取環形隊列數據*/

int ring_buff_get(struct ring_buff * p_ring_buff)

{

int data = 0;

if(p_ring_buff == NULL)

{

printf(“p null

”);

return (-1);

}

if(get_ring_buff_emptystate(p_ring_buff) == 1)

{

printf(“buff is empty

”);

return (-2);

}

data = p_ring_buff-》array[p_ring_buff-》R%LEN];

p_ring_buff-》R++;

return data;

}

/*銷毀*/

int ring_buff_destory(struct ring_buff * p_ring_buff)

{

if(p_ring_buff == NULL)

{

printf(“p null

”);

return (-1);

}

free(p_ring_buff);

return (0);

}

int main()

{

int i = 0;

/*定義一個環形緩沖區*/

ring pt_ring_buff = fifo_init();

/*向環形緩沖區中寫入數據*/

for(i = 0;i《10;i++)

{

ring_buff_insert(pt_ring_buff,i);

}

/*從環形緩沖區中讀出數據*/

for(i = 0;i《10;i++)

{

printf(“%d ”,ring_buff_get(pt_ring_buff));

}

/*銷毀一個環形緩沖區*/

ring_buff_destory(pt_ring_buff);

return (1);

}

599cb322-b20d-11eb-bf61-12bb97331649.png

換一個寫法,這個寫法是各種大神級別的

/* 實現的最簡單的ringbuff 有更多提升空間,可以留言說明 */

#include “stdio.h”

#include “stdlib.h”

#define LEN 64

/*環形隊列結構體*/

typedef struct ring_buff{

int array[LEN];

int W;

int R;

}*ring;

/*環形隊列初始化*/

struct ring_buff * fifo_init(void)

{

struct ring_buff * p = NULL;

p = (struct ring_buff *)malloc(sizeof(struct ring_buff));

if(p == NULL)

{

printf(“fifo_init malloc error

”);

return NULL;

}

p-》W = 0;

p-》R = 0;

return p;

}

/*判斷環形隊列是否已經滿了*/

int get_ring_buff_fullstate(struct ring_buff * p_ring_buff)

{

/*如果寫位置減去讀位置等于隊列長度,就說明這個環形隊列已經滿*/

if((p_ring_buff-》W - p_ring_buff-》R) == LEN)

{

return (1);

}

else

{

return (0);

}

}

/*判斷環形隊列為空*/

int get_ring_buff_emptystate(struct ring_buff * p_ring_buff)

{

/*如果寫位置和讀的位置相等,就說明這個環形隊列為空*/

if(p_ring_buff-》W == p_ring_buff-》R)

{

return (1);

}

else

{

return (0);

}

}

/*插入數據*/

int ring_buff_insert(struct ring_buff * p_ring_buff,int data)

{

if(p_ring_buff == NULL)

{

printf(“p null

”);

return (-1);

}

if(get_ring_buff_fullstate(p_ring_buff) == 1)

{

printf(“buff is full

”);

return (-2);

}

//p_ring_buff-》array[p_ring_buff-》W%LEN] = data;

p_ring_buff-》array[p_ring_buff-》W&(LEN -1)] = data;

p_ring_buff-》W ++;

//printf(“inset:%d %d

”,data,p_ring_buff-》W);

return (0);

}

/*讀取環形隊列數據*/

int ring_buff_get(struct ring_buff * p_ring_buff)

{

int data = 0;

if(p_ring_buff == NULL)

{

printf(“p null

”);

return (-1);

}

if(get_ring_buff_emptystate(p_ring_buff) == 1)

{

printf(“buff is empty

”);

return (-2);

}

//data = p_ring_buff-》array[p_ring_buff-》R%LEN];

data = p_ring_buff-》array[p_ring_buff-》R&(LEN -1)];

p_ring_buff-》R++;

return data;

}

/*銷毀*/

int ring_buff_destory(struct ring_buff * p_ring_buff)

{

if(p_ring_buff == NULL)

{

printf(“p null

”);

return (-1);

}

free(p_ring_buff);

return (0);

}

int main()

{

int i = 0;

/*定義一個環形緩沖區*/

ring pt_ring_buff = fifo_init();

/*向環形緩沖區中寫入數據*/

for(i = 0;i《10;i++)

{

ring_buff_insert(pt_ring_buff,i);

}

/*從環形緩沖區中讀出數據*/

for(i = 0;i《10;i++)

{

printf(“%d ”,ring_buff_get(pt_ring_buff));

}

/*銷毀一個環形緩沖區*/

ring_buff_destory(pt_ring_buff);

return (1);

}

總結

環形隊列的使用場景非常多,安卓的音頻數據讀寫,很多都用到環形隊列,我們在開發過程中使用的環形隊列肯定比我上面的那個例子要復雜的多,我這里演示的是比較簡單的功能,但是麻雀雖小,五臟俱全,希望這個麻雀讓你們了解這個數據結構。在實際項目中大展身手。

原文標題:C語言實現環形隊列的原理和方法

文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7335

    瀏覽量

    94771
  • C語言
    +關注

    關注

    183

    文章

    7644

    瀏覽量

    145598

原文標題:C語言實現環形隊列的原理和方法

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RDMA設計43:隊列刪除及連接斷開功能測試

    在接收到正確的刪除隊列請求后,首先進入連接斷開流程,即四次揮手斷鏈,如圖中紅框部分。隨后進行隊列刪除操作。返回隊列操作狀態 0x2b,符合設計預期,驗證通過。
    的頭像 發表于 02-24 07:50 ?550次閱讀
    RDMA設計43:<b class='flag-5'>隊列</b>刪除及連接斷開功能測試

    RDMA設計26:隊列管理模塊設計之接收隊列模塊詳細分析

    本文主要交流設計思路,在本博客已給出相關博文100多篇,希望對初學者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設計。 (2)接收隊列 接收隊列由一個接收隊列管理單元組成。與發送
    發表于 01-22 09:03

    RDMA設計24:隊列管理模塊設計

    隊列管理模塊采用管理與存儲分離的結構進行設計,由發送隊列存儲、發送隊列管理、接收隊列管理、完成條目解析、異常完成條目處理和 Round-Robin 仲裁組成。
    的頭像 發表于 01-20 11:45 ?1367次閱讀
    RDMA設計24:<b class='flag-5'>隊列</b>管理模塊設計

    C語言主要特點

    C語言的主要特點有: 1.語言簡潔、緊湊,使用方便、靈活 。C語言一共只有32個關鍵字、9種控制
    發表于 01-05 07:41

    RDMA設計17:隊列管理模塊設計2

    。 (2)接收隊列 接收隊列由一個接收隊列管理單元組成。與發送隊列類似的是,接收隊列管理單元也由若干表單構成,其中包括 RQ1 表單和用戶
    發表于 01-04 14:54

    C語言C++的區別及聯系

    C語言C++到底是什么關系? 首先C++和C語言本來就是兩種不同的編程
    發表于 12-24 07:23

    C語言的循環隊列

    循環隊列(Circular Buffer) typedef struct { int buffer[SIZE]; int head; int tail; int count
    發表于 12-12 08:28

    C語言和單片機C語言有什么差異

    單片機c語言相對于普通C語言增加了一些基本的指令,還有變量的賦值是16進制,當然單片機c語言只牽
    發表于 11-14 07:55

    基于環形隊列的UART收發回顯實驗

    問題。在本實驗中,我們使用環形隊列來實現實驗1的串口收發回顯,將串口接收到的數據暫存在隊列中,待完成一次接收后再將隊列中的數據全部發出去。
    的頭像 發表于 10-27 13:51 ?1983次閱讀
    基于<b class='flag-5'>環形</b><b class='flag-5'>隊列</b>的UART收發回顯實驗

    RabbitMQ消息隊列解決方案

    在現代分布式系統架構中,消息隊列作為核心組件,承擔著系統解耦、異步處理、流量削峰等重要職責。RabbitMQ作為一款成熟的消息隊列中間件,以其高可用性、高可靠性和豐富的特性,成為眾多企業的首選方案。本文將從運維工程師的角度,詳細闡述RabbitMQ從單機部署到集群搭建的完
    的頭像 發表于 07-08 15:55 ?633次閱讀

    NVME控制器之隊列管理模塊

    隊列管理模塊是整個NVMe Host控制器的核心模塊,該模塊實現了提交隊列與完成隊列的管理,多隊列請求的仲裁判決等功能。隊列管理模塊中含有數
    的頭像 發表于 05-03 15:32 ?658次閱讀
    NVME控制器之<b class='flag-5'>隊列</b>管理模塊

    深入理解C語言C語言循環控制

    C語言編程中,循環結構是至關重要的,它可以讓程序重復執行特定的代碼塊,從而提高編程效率。然而,為了避免程序進入無限循環,C語言提供了多種循環控制語句,如break、continue和
    的頭像 發表于 04-29 18:49 ?2046次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>C</b><b class='flag-5'>語言</b>循環控制

    淺談環形鐵心兼談環形變壓器

    近年來,在電子市場上,環形變壓器已廣泛用于家庭影院和多種電子設備中,而繞制環形變壓器所用的鐵心即環形鐵心,可分A、B兩種系列,現介紹如下: 1. A系列環形鐵心 A系列
    發表于 04-16 15:04

    C語言的歷史及程序介紹

    電子發燒友網站提供《C語言的歷史及程序介紹.pdf》資料免費下載
    發表于 04-09 16:10 ?0次下載

    OptiSystem應用:環形通量仿真

    環形通量,顧名思義就是描述了光纖內部圓形半徑內的通量。環繞通量通常被量化為從光纖中心開始的半徑,該半徑需要環繞穿過光纖的25%到75%的光能。由環繞通量值描述的光纖的功率分布是確保千兆以太網系統中所
    發表于 04-09 08:47