Здравствуйте, smeeld, Вы писали:
S>использование сохранённого ранее значения в reinit_if_necessary(descp, current_chunk) вместо получаемого с get_current_storage_chunk, приведёт к сегфолту в течении 1-5 секунд. Там везде вызывается get по той причине, что другие могут вызвать и вызывают set. Использование непоследовательного значения в set, полученного не через вызов get при вызове set, а через вызов get с сохранением этого значения где-то и применением его через некоторое время в set, приведёт к нарушению механизма синхронизации. Там lockfree.
Кстати говоря, вот это все выглядит просто феерично. У вас в многопоточном коде есть что-то вроде:
data->set_v(data->get_v());
и вы пытаетесь вещать, что это никак нельзя переписать вот так:
auto v = data->get_v();
data->set_v(v);
Поскольку тогда в v может оказаться "непоследовательное" значение, т.к. где-то на другой нити кто-то навызывает set/get_v.
Вот это уже точно смахивает на детский сад, поскольку даже вот в этом виде:
data->set_v(data->get_v());
у вас нет никаких гарантий того, что в set_v попадет "последовательное" значение из только что вызванного get_v. Ибо между вызовом get_v и передачей значения в set_v может вклиниться кто угодно и навызывать set/get_v сколько угодно раз.
Но, предположу, что сейчас последуют какие-то очередные открытия, что у вас там некий очень продвинутый lockfree и вообще непрерываемость последовательности вызовов гарантируется мега-хитрыми механизмами синхроннизации, оставшимися "за кадром".
Тем не менее, пояснение вида
"Там везде вызывается get по той причине, что другие могут вызвать и вызывают set. Использование непоследовательного значения в set, полученного не через вызов get при вызове set, а через вызов get с сохранением этого значения где-то и применением его через некоторое время в set, приведёт к нарушению механизма синхронизации." феерично само по себе.