Есть lock-free способы. Например как-то так, для одного писателя и одного читателя,
Код
struct data d[3], *w, *r;
writer ()
{
struct data *p;
for (i = 0; i < 3; ++i) {
p = d + i;
if (p != r && p != w)
break;
}
p->adc1 = ADC1;
p->adc2 = ADC2;
...
w = p;
}
read ()
{
r = w;
return r;
}
r = read ();
foo(r->adc1);
bar(r->adc2);
...
Но,
- Нужно время на отладку своей реализации, надо не забывать о соблюдении порядка доступа к памяти, как на уровне генерации кода так и при работе конвеера вычислителя
- Надежность блокировок может быть важнее производительности
- Неизвестно ещё, что будет быстрее