環形緩衝c語言,環形緩衝區 c語言 實現

本文目錄一覽:

c語言如何編寫一個簡單的多線程程序?

這是一個多線程例子,裡面只有兩個線程,是生產者/消費者模式,已編譯通過,注釋很詳細,

如下:

/* 以生產者和消費者模型問題來闡述Linux線程的控制和通信你

生產者線程將生產的產品送入緩衝區,消費者線程則從中取出產品。

緩衝區有N個,是一個環形的緩衝池。

*/

#include stdio.h

#include pthread.h

#define BUFFER_SIZE 16

struct prodcons

{

int buffer[BUFFER_SIZE];/*實際存放數據的數組*/

pthread_mutex_t lock;/*互斥體lock,用於對緩衝區的互斥操作*/

int readpos,writepos; /*讀寫指針*/

pthread_cond_t notempty;/*緩衝區非空的條件變數*/

pthread_cond_t notfull;/*緩衝區未滿 的條件變數*/

};

/*初始化緩衝區*/

void pthread_init( struct prodcons *p)

{

pthread_mutex_init(p-lock,NULL);

pthread_cond_init(p-notempty,NULL);

pthread_cond_init(p-notfull,NULL);

p-readpos = 0;

p-writepos = 0;

}

/*將產品放入緩衝區,這裡是存入一個整數*/

void put(struct prodcons *p,int data)

{

pthread_mutex_lock(p-lock);

/*等待緩衝區未滿*/

if((p-writepos +1)%BUFFER_SIZE ==p-readpos)

{

pthread_cond_wait(p-notfull,p-lock);

}

p-buffer[p-writepos] =data;

p-writepos++;

if(p-writepos = BUFFER_SIZE)

p-writepos = 0;

pthread_cond_signal(p-notempty);

pthread_mutex_unlock(p-lock);

}

/*從緩衝區取出整數*/

int get(struct prodcons *p)

{

int data;

pthread_mutex_lock(p-lock);

/*等待緩衝區非空*/

if(p-writepos == p-readpos)

{

pthread_cond_wait(p-notempty ,p-lock);//非空就設置條件變數notempty

}

/*讀書據,移動讀指針*/

data = p-buffer[p-readpos];

p-readpos++;

if(p-readpos == BUFFER_SIZE)

p-readpos = 0;

/*設置緩衝區未滿的條件變數*/

pthread_cond_signal(p-notfull);

pthread_mutex_unlock(p-lock);

return data;

}

/*測試:生產站線程將1 到1000的整數送入緩衝區,消費者線程從緩衝區中獲取整數,兩者都列印信息*/

#define OVER (-1)

struct prodcons buffer;

void *producer(void *data)

{

int n;

for( n=0;n1000;n++)

{

printf(“%d ——\n”,n);

put(buffer,n);

}

put(buffer,OVER);

return NULL;

}

void *consumer(void *data)

{

int d;

while(1)

{

d = get(buffer);

if(d == OVER)

break;

else

printf(“—–%d\n”,d);

}

return NULL;

}

int main()

{

pthread_t th_p,th_c;

void *retval;

pthread_init(buffer);

pthread_create(th_p,NULL,producer,0);

pthread_create(th_c,NULL,consumer,0);

/*等待兩個線程結束*/

pthread_join(th_p, retval);

pthread_join(th_c,retval);

return 0;

}

c語言中多線程讀寫同一個環形緩衝區的實現

#include stdio.h

#include windows.h

#include process.h

unsigned __stdcall ThreadWrite(void* param);

unsigned __stdcall ThreadRead(void* param);

int WriteSeque = 0;

int ReadSeque = 0;

int RingBuf[4];

void main()

{

HANDLE htw = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite, NULL, 0, 0);

HANDLE htr = (HANDLE)_beginthreadex(NULL, 0, ThreadRead, NULL, 0, 0);

CloseHandle(htw);

CloseHandle(htr);

while (1)

{

if (WriteSeque = 100)

{

break;

}

}

printf(“Quit\n”);

}

unsigned __stdcall ThreadWrite(void* param)

{

int i = 0;

while (1)

{

if (WriteSeque = ReadSeque WriteSeque- ReadSeque 4)

{

RingBuf[WriteSeque%4] = i;

printf(“Write:%d\n”, i);

i++;

WriteSeque++;

Sleep(50);

}

}

}

unsigned __stdcall ThreadRead(void* param)

{

while (1)

{

if (ReadSeque WriteSeque)

{

printf(“Read:%d\n”, RingBuf[ReadSeque%4]);

ReadSeque++;

Sleep(100);

}

}

}

為了讓你看到效果,讀寫線程的休眠時間略有不同。

怎樣用c語言實現一個環形緩存區!

定義個數組如a[10];

用兩個head tail 指針

存入數據後tail++ 讀取數據後head++

為了循環利用此塊空間 做以下處理:

存跟讀數據時指針處理 tail%10 head%10

判斷緩存空?tail == head+1

判斷緩存滿?tail == head+9

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/306087.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-02 12:00
下一篇 2025-01-02 12:00

相關推薦

  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28

發表回復

登錄後才能評論