В частности, :ets.tab2list
и :ets.file2tab
. Делают ли эти функции «моментальный снимок» состояния таблицы, или другие операции могут чередовать чтение и запись, пока эти функции завершаются?
Являются ли массовые операции ETS атомарными?
Ответы (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
, чтобы получить остальные куски в таблице.
ets.erl
, но не упомянул об этом: P. Я обновил ответ этой информацией.
- person juan.facorro; 01.08.2017
tab2file
вместоtab2list
? - person Dogbert   schedule 31.07.2017