#define MAX_SIZE 100 struct buffer_element { } struct ring_buffer { int consumer_ind; int producer_ind; buffer_element elements[MAX_SIZE]; } struct ring_buffer buf; buf.consumer_ind = 0 buf.producer_ind = 0 //rw_lock my_lock; int write(buffer_element *element) { if (buf.producer_ind == (buf.consumer_ind - 1) % MAX_SIZE) { return -1 } memcpy(&buf.elements[buf.producer_ind], element, sizeof(buffer_element)) buf.producer_ind = buf.producer_ind == MAX_SIZE -1 ? 0 : buf.producer_ind + 1; return 0; } int read(buffer_element *element) { if (buf.producer_ind == buf.consumer_ind) { // no data return -1; } memcpy(element, &buf.elements[buf.consumer_ind], sizeof(buffer_element)) buf.consumer_ind = buf.consumer_ind == MAX_SIZE -1 ? 0 : buf.consumer_ind + 1; return 0; }