3

具体来说,:ets.tab2list:ets.file2tab。这些函数是否“快照”表状态,或者其他操作可以在这些函数完成时交错读取和写入?

4

1 回答 1

2

根据此处的文档:

内部遍历表的函数,如selectand match,提供与safe_fixtable.

在哪里

[...] 函数safe_fixtable可用于保证一系列 first/1 和 next/2 调用无错误地遍历表,并且表中的每个现有对象都被访问一次,即使另一个(或相同)进程同时删除或插入对象到表中。

特别与您的问题有关:

没有其他保证;特别是在这种遍历过程中插入或删除的对象可以访问一次或根本不访问。


编辑

ets:tab2list/1调用ets:match_object/2它是用 C 实现的内置函数 (BIF)。这里的实现是使用 BIF ets_select2,它是ets:select/2.

ets:file2tab最终调用load_table/3它只是使用ets:insert/2.

ets:tab2file/3in的代码用于ets.erl获取ets:select/3第一个块,然后ets:select/1获取表中的其余块。

于 2017-07-31T23:27:41.387 回答