1. 程式人生 > >環形雙緩衝佇列

環形雙緩衝佇列

原文來自,已經做修改,在VS2015上測試沒問題

// ConsoleApplication1.cpp : 定義控制檯應用程式的入口點。

//


#include "stdafx.h"
#include"string.h"
#include"stdio.h"
#include <stdlib.h>




#define BUFFSIZE 255  
#define min(x, y) ((x) < (y) ? (x) : (y)) 


struct cycle_buffer {
unsigned char *buf;
unsigned int size;
unsigned int in;
unsigned int out;
};


static struct cycle_buffer *fifo = NULL;


static int init_cycle_buffer(void)
{
int size = BUFFSIZE, ret;


ret = size & (size - 1);//按位與50->51
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;
fifo->buf = (unsigned char *)malloc(size);
if (!fifo->buf)
free(fifo);
else
memset(fifo->buf, 0, size);//初始化fifo
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)
{
unsigned char buf[16];
unsigned int n;


memset(buf, 0, sizeof(buf));
n = fifo_get(buf, sizeof(buf));


printf("nnafter thread_read : %s %d \n ", buf, sizeof(buf));
}


static void thread_write(void)
{
unsigned char buf[] = "hello world";
fifo_put(buf, sizeof(buf));


}


int main(void)
{
int ret;
ret = init_cycle_buffer();
if (ret == -1)
return ret;
printf("start run\n");


thread_write();
thread_read();


while (1);
return 0;
}

相關推薦

環形緩衝佇列

原文來自,已經做修改,在VS2015上測試沒問題 // ConsoleApplication1.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include"string.h" #include"stdio.h" #inclu

實現一個緩衝佇列

在生產者-消費者模式中,我們常常會使用到佇列,這個佇列在多個執行緒共享訪問時存在互斥和競爭操作, 意味著每次訪問都要加鎖。如何更好的如何減少鎖競爭次數呢 ?今天要介紹的雙緩衝佇列就是個不錯的選擇。 雙緩衝佇列就是衝著同步/互斥的開銷來的。我們知道,在多個執行緒併發訪問同一個資源的時候,需要特別注意執行緒的

環形緩衝區:環形緩衝佇列學習

專案中需要執行緒之間共享一個緩衝FIFO佇列,一個執行緒往佇列中添資料,另一個執行緒取資料(經典的生產者-消費者問題)。開始考慮用STL的vector容器, 但不需要隨機訪問,頻繁的刪除最前的元素引起記憶體移動,降低了效率。使用LinkList做佇列的話,也需要頻繁分配和

佇列,佇列

我的宗旨就是不打一行程式碼,哼. 佇列就是先進先出,不多講,想弄清楚的自行百度,但看我接下來的文字你並不需要知道那麼多. 好了,前面我們講到了順序表也就是列表了,那我們用列表能否實現呢?毫無疑問是可以實現的,但是要拿列表實現佇列需要insert()和pop(),前面一篇文章講到了,使用insert()的操

BZOJ 2457 - 佇列 - [思維題]

題目連結:https://www.lydsy.com/JudgeOnline/problem.php?id=2457 Description Sherry現在碰到了一個棘手的問題,有N個整數需要排序。 Sherry手頭能用的工具就是若干個雙端佇列。她需要依次處理這N個數,對於每個數,Sherry能做以下兩件

OpenGL單緩衝緩衝的區別

單快取和雙快取 在我們電腦中,螢幕中顯示的東西都會被放在一個稱為顯示快取的地方,在通常情況下我們只有一個這樣的緩衝區即單緩衝,在單緩衝中任何繪圖的過程都會被顯示在螢幕中,這也就是我們為什麼會看到閃爍。而所謂雙緩衝就是再這個顯示的緩衝區之外再建立一個不顯示的緩衝區,我們所有的繪圖都將在這個

Java併發程式設計:4種執行緒池和緩衝佇列BlockingQueue

一. 執行緒池簡介 1. 執行緒池的概念:           執行緒池就是首先建立一些執行緒,它們的集合稱為執行緒池。使用執行緒池可以很好地提高效能,執行緒池在系統啟動時即建立大量空閒的執行緒,程式將一個任務傳給執行緒池,執行緒池就會啟動一

電路維修 --- 佇列bfs

傳送門:洛谷P2243 題目描述 分析 初步判斷,是道最短路的題.   首先就是建圖了,對於電路板上的每一對角線,令與讀入方向相同的路徑邊權為0,方向相反的邊權為1.   由於只能走斜線,根據網格圖的性質可知橫縱座標之和為奇數的點是到不了的,預設起點為

Leetcode 753. Cracking the Safe 佇列實現 給出證明思路

題意 我們希望構造一個最短的字串,這個字串每位可以是0至k-1的字元,並且這個字串的所有n長子串可以包含所有的 nk n k

SurfaceView緩衝機制

什麼是緩衝? 在我們的介面中圖形都是在畫布上繪製出來的,所以這個繪製的過程就叫緩衝,而畫布也就可以稱作緩衝區。 緩衝的種類: 無緩衝:不使用畫布的情況下直接在視窗上進行繪圖就叫做無緩衝繪圖。 單緩衝:用了一個畫布,將所有的內容先繪製到畫布上,再整體繪製到視窗,這個就叫做單緩衝繪圖

Leetcode|Sliding Window Maximum(multiset,優先佇列,佇列和區間樹的應用)

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can

codeforces+516 Div. 2+D.迷宮+搜尋+佇列

題目連結:http://codeforces.com/contest/1064/problem/D 題目大意:給你一個n*m的矩陣,*是牆,給你初始的座標,可以向左走x步,向右走y步,上下無數步,問你可能走的最多方塊數。 思路:bfs,開一個佇列,從起點開始,每搜到一個格子就打上標記。這樣

NYOJ 1128 手速(佇列

題目1128 手速 時間限制: 1000 ms  |  記憶體限制: 65535 KB 難度: 1 描述

UVA 210 佇列、模擬

  模擬單道處理系統。注意不同的程式可能會使用同一變數。 #include <bits/stdc++.h> #define ll long long using namespace std; const int N=1e3+5; deque<int>ls

CH 2601 - 電路維修 - [佇列BFS]

題目連結:傳送門 描述 Ha'nyu是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女Rika,從而被收留在地球上。Rika的家裡有一輛飛行車。有一天飛行車的電路板突然出現了故障,導致無法啟動。電路板的整體結構是一個R行C列的網格(R,C≤500),如右圖所示。每個格點都是電線的接點,每個

6-2 佇列 (25 分)

雙端佇列(deque,即double-ended queue的縮寫)是一種具有佇列和棧性質的資料結構,即可以(也只能)線上性表的兩端進行插入和刪除。若以順序儲存方式實現雙端佇列,請編寫例程實現下列操作: Push(X,D):將元素X插入到雙端佇列D的頭; Pop(D):刪除雙端佇列D

資料結構之佇列(Deque)

1,雙端佇列定義   雙端佇列:其兩端都可以入列和出列的資料結構,如下圖所示,佇列後面(rear)可以加入和移出資料,佇列前面(front)可以加入和移出資料        雙端佇列操作: deque=Deque() # 建立雙端佇列 addFront(item) #在佇列前面加入資料 a

C語言 緩衝控制檯防閃屏技術

  對於這個東西相信大家非常陌生,因為現在除了學“C語言”和“資料結構”這些基礎課程的大學生,基本沒人會用到控制檯了。哪怕是用到,也不會關心它閃不閃屏的問題。   但在一種特殊的情況下需要用到,那就是寫“貪吃蛇”這個遊戲的時候……   貪吃蛇遊戲的設計原理

pyhton中佇列

# -*- coding: utf-8 -*- """ Created on Tue May 29 16:33:10 2018 @author: Administrator """ # queue # deque import collections #import threading impor

MFC緩衝繪圖解決介面閃爍問題

一:為什麼會產生介面閃爍? 解釋這個之前,我們需要明白的是在MFC裡面繪圖的訊息響應機制,大概的就是如果我們要在某一個 東西上面繪圖,比如對話方塊,單文件等等,就必須先得到圖形DC的控制代碼(handle),然後在指定控制代碼的基礎上進行圖形操作,也就是MFC常用的CDC *DC = this-