具体而言,:ets.tab2list
和:ets.file2tab
。这些函数是否“快照”了表状态,还是其他操作可以在这些函数完成时交错读取和写入?
答案 0 :(得分:2)
基于文档here:
内部遍历表格的函数(如
select
和match
)提供与safe_fixtable
相同的保证。
其中
[...]函数
safe_fixtable
可用于保证first / 1和next / 2调用序列无错误地遍历表,并且表中的每个现有对象只被访问一次,甚至如果另一个(或相同的)进程同时删除或插入表中的对象。
特别与您的问题相关:
没有其他保证;特别是在这种遍历期间插入或删除的对象可以访问一次或根本不访问。
编辑
ets:tab2list/1
调用ets:match_object/2
这是一个用C实现的内置函数(BIF)。实现here正在使用BIF ets_select2
,这是一个实现ets:select/2
。
ets:file2tab
最终会调用load_table/3
,只使用ets:insert/2
。
ets.erl
中ets:tab2file/3
的代码,使用ets:select/3
获取第一个块,然后使用ets:select/1
获取表中的其余块。