, : consume() b->readpos, thread consume() , . volatile, , :
void * consume (buf_t *b) {
int rp = b->readpos;
while (rp == b->writepos);
int next = (rp + 1) % BUF_SIZE;
void * res = b->buffer[rp]; b->readpos = next;
return res;
}
, - ( , b->buffer[n] 15 16 , b->buffer[n+1]). :
#define STRIDE 16
#define STEPS 2048
#define BUF_SIZE (STRIDE * STEPS)
#define TO_INDEX(n) (STRIDE * (((n) + 1) % STEPS) + (((n) + 1) / STEPS))
void produce (buf_t *b, void * e) {
unsigned wp = b->writepos;
unsigned next = (wp + 1) % BUF_SIZE;
while (b->readpos == next);
b->buffer[TO_INDEX(wp)] = e; b->writepos = next;
}
void * consume (buf_t *b) {
unsigned rp = b->readpos;
while (rp == b->writepos);
unsigned next = (rp + 1) % BUF_SIZE;
void * res = b->buffer[TO_INDEX(rp)]; b->readpos = next;
return res;
}
, . ( , , STRIDE STEPS 2, TO_INDEX() , unsigned - ).