링버퍼 예제

  • このエントリーをはてなブックマークに追加

예를 들어 길이 32 바이트의 원형 버퍼가 필요한 경우 응용 프로그램에서 이와 같은 작업을 수행하면이 메서드가 작동하는 것처럼 보이지만 간단한 테스트 등을 통과하지만 미묘한 버그가 포함되어 있습니다. 충분한 큐 작업 (20 억 이상)으로 in의 int 값이 오버플로되어 음수가 됩니다! 조절자(또는 `나머지`) 연산자 %는 부호를 보존합니다. 따라서 당신은 예를 들어 b[-14]로 작성 끝낼 수 있습니다! 이 예제에서는 모순, 요소 삽입, 덮어쓰기 및 터지는 것을 보여 주어집니다. 링 버퍼는 연속 메모리가 원형인 것처럼 처리되고 두 개의 인덱스 카운터가 큐의 현재 시작과 끝을 추적하는 간단하고 일반적으로 고정된 크기의 저장소 메커니즘입니다. 배열 인덱싱이 순환이 아니므로 인덱스 카운터는 배열의 끝을 지나 이동할 때 0으로 감아야 합니다. 큐의 앞쪽에 데이터가 추가되거나 큐의 꼬리에서 제거(큐의 큐제거)되면 버퍼의 현재 항목은 트랙 A 단순(단일 스레드) 구현에 동그라미를 그리는 것처럼 보이는 기차를 형성합니다. 큐 및 dequeue는 언더플로우 또는 오버플로를 방지하지 않습니다 – 큐가 가득 차있을 때 항목을 추가하고 큐가 비어있을 때 항목을 제거할 수 있습니다. 예를 들어 큐에 20개의 정수(1,2,3…)를 추가하고 항목을 큐에 두지 않은 경우 17,18,19,20의 값이 1,2,3,4를 덮어씁니다. 우리는 지금이 문제를 해결 하지 않습니다., 대신 우리가 멀티 스레드 버전을 만들 때 우리는 링 버퍼가 가득 또는 비어 있는 동안 enqueue-ing 및 dequeue-ing 스레드가 차단 되도록 합니다. 순환 버퍼를 인스턴스화하려면 개체를 선언하고 버퍼에 대한 템플릿 형식을 지정하기만 하면 됩니다. 다음은 10개의 uint32_t 항목의 버퍼를 사용하는 예제입니다.

길을 따라 피드백을 제공 한 모든 사람에게 감사드립니다. 예제가 업데이트되었습니다: 순환 버퍼가 먼저 비어 있고 미리 정의된 길이가 시작됩니다. 예를 들어, 이것은 7 요소 버퍼: 빈 및 전체 케이스의 논리는 C 예제와 동일 합니다. 전체 버퍼에 대한 전체 버퍼가 아닌 버퍼(그리고 해당 시점에서 동작 변경)-self.__class_ _를 변경하여 모델링했습니다. 이것은 파이썬 2.2에서도 두 클래스가 동일한 슬롯을 가지고 있는 한 작동합니다 (예 : 링 버퍼 및 __Full이 레시피에서 _Full과 같은 두 개의 클래식 클래스에 대해 잘 작동합니다). 예제 코드를 간단하고 간단하게 유지하기 위해 간단한 핸들 구현을 고수할 것입니다. 정수의 8위치 순환 버퍼를 보여 주는 프로그램을 만듭니다.

  • このエントリーをはてなブックマークに追加