Являются ли массовые операции ETS атомарными?

В частности, :ets.tab2list и :ets.file2tab. Делают ли эти функции «моментальный снимок» состояния таблицы, или другие операции могут чередовать чтение и запись, пока эти функции завершаются?


person knite    schedule 31.07.2017    source источник
comment
Вы имели в виду tab2file вместо tab2list?   -  person Dogbert    schedule 31.07.2017
comment
Оба, я ожидаю, что у них будут одинаковые гарантии или их отсутствие.   -  person knite    schedule 01.08.2017


Ответы (1)


На основе документации здесь:

Функции, которые внутренне обходят таблицу, такие как select и match, дают ту же гарантию, что и safe_fixtable.

Где

[...] функция safe_fixtable может использоваться, чтобы гарантировать, что последовательность вызовов first/1 и next/2 проходит по таблице без ошибок и что каждый существующий объект в таблице посещается ровно один раз, даже если другой (или тот же) процесс одновременно удаляет или вставляет объекты в таблицу.

И конкретно по вашему вопросу:

Ничто другое не гарантируется; в частности, объекты, которые вставляются или удаляются во время такого обхода, могут быть посещены один раз или не посещены вообще.


ИЗМЕНИТЬ

ets:tab2list/1 вызывает ets:match_object/2, который является встроенная функция (BIF), реализованная на C. Реализация здесь использует BIF ets_select2, который является реализацией для ets:select/2.

ets:file2tab завершается вызовом load_table/3, который просто использует ets:insert/2.

Код для ets:tab2file/3 в ets.erl использует ets:select/3, чтобы получить первый фрагмент а затем ets:select/1, чтобы получить остальные куски в таблице.

person juan.facorro    schedule 31.07.2017
comment
Я не верю, что эти документы отвечают на вопрос. Неясно, используют ли tab2x и x2tab select/match, safe_fixtable или какой-либо другой механизм. - person knite; 01.08.2017
comment
@knite Вы правы, я следовал коду в ets.erl, но не упомянул об этом: P. Я обновил ответ этой информацией. - person juan.facorro; 01.08.2017