ring buffer 예제

이 구현에서 uint8_t를 기본 데이터 유형으로 선택했습니다. 원하는 특정 형식을 사용할 수 있습니다. 순환 버퍼를 인스턴스화하려면 개체를 선언하고 버퍼에 대한 템플릿 형식을 지정하기만 하면 됩니다. 다음은 10개의 uint32_t 항목의 버퍼를 사용하는 예제입니다: 먼저 사용자가 순환 버퍼와 상호 작용하는 방법을 고려해야 합니다. 캡슐화를 보존하기 위해 컨테이너 구조는 헤더가 아닌 라이브러리 .c 파일 내부에 정의됩니다. 또는 버퍼를 관리하는 루틴으로 인해 데이터를 덮어쓰지 못하게 하고 오류를 반환하거나 예외를 발생시킬 수 있습니다. 데이터를 덮어쓰는지 여부는 버퍼 루틴의 의미 체계 또는 순환 버퍼를 사용하는 응용 프로그램에 달려 있습니다. 버퍼의 요소 수를 계산하는 것은 예상보다 까다로운 문제였습니다. 많은 제안 된 크기 계산은 modulo를 사용하지만 테스트 할 때 이상한 코너 케이스에 부딪혔습니다. 조건문을 사용하여 단순화된 계산을 선택했습니다. C++ 표준 라이브러리에 순환 버퍼 유형을 추가하는 제안서가 있습니다.

API에는 클라이언트가 기본 버퍼 및 버퍼 크기를 제공하고 순환 버퍼 핸들을 반환합니다. 이 라이브러리 버퍼 라이브러리의 구현을 완료합니다. 철 시스템의 잠금 무료 링 버퍼 문서에 대한 링크가 추가되었습니다. 그러나 적어도 나는이 표현을 좋아한 적이 없다. 링 버퍼의 가장 일반적인 용도는 동시 판독기와 기록기 사이의 중개자(두 스레드, 메모리 공유 프로세스 또는 하드웨어와 통신하는 소프트웨어 프로세스)입니다. 그리고 이를 위해 인덱스 + 크기 표현은 일종의 비참합니다. 독자와 작성자 모두 길이 필드에 쓰기때문에 캐싱이 잘못됩니다. 읽기 인덱스와 길이는 항상 원자적으로 읽고 업데이트해야 하므로 어색할 수 있습니다. 지금까지 링 버퍼의 가장 일반적인 사용 사례는 버퍼를 통해 통신하는 두 개의 동시 액터를 사용하는 것입니다.

하나는 데이터를 읽고 다른 하나는 씁니다. 이를 위해 별도의 읽기 / 쓰기 포인터가 필요합니다. 이 메서드에서는 N 요소 버퍼에서 N-1 요소만 의도적으로 사용합니다. 마지막 요소는 빈 경우와 전체 사례를 구분하기 위해 (이 보다 플래그와 유사하게) 사용됩니다. 이 논리에 따라 순환 버퍼는 메모리를 순환으로 처리하는 FIFO 데이터 구조입니다. 즉, 읽기/쓰기 인덱스는 버퍼 길이에 도달하면 0으로 다시 반복됩니다.

02 August, 2019
Posted in Uncategorized

Author: wolff