Платформа, на которой вы работаете, определяет размер атомарных операций чтения / записи. Как правило, 32-разрядная (регистровая) платформа поддерживает только 32-разрядные атомарные операции. Итак, если вы пишете более 32 бит, вам, вероятно, придется использовать какой-то другой механизм для координации доступа к этим общим данным.
Один механизм заключается в удвоении или тройном буфере фактических данных и использовании общего индекса для определения «последней» версии:
write(blah)
{
new_index= ...; // find a free entry in the global_data array.
global_data[new_index]= blah;
WriteBarrier(); // write-release
global_index= new_index;
}
read()
{
read_index= global_index;
ReadBarrier(); // read-acquire
return global_data[read_index];
}
Вам нужны барьеры памяти, чтобы гарантировать, что вы не читаете с global_data[...]
до тех пор, пока не прочитаете global_index
, и не будете писать на global_index
до тех пор, пока не напишите на global_data[...]
.
Это немного ужасно, поскольку вы также можете столкнуться с проблемой ABA с вытеснением, поэтому не используйте это напрямую.