【发布时间】:2018-01-06 11:45:03
【问题描述】:
具体来说,:ets.tab2list 和 :ets.file2tab。这些函数是“快照”表状态,还是其他操作可以在这些函数完成时交错读写?
【问题讨论】:
-
您的意思是
tab2file而不是tab2list? -
两者,我希望他们有相同的保证或缺乏保证。
具体来说,:ets.tab2list 和 :ets.file2tab。这些函数是“快照”表状态,还是其他操作可以在这些函数完成时交错读写?
【问题讨论】:
tab2file 而不是tab2list?
基于文档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 获取表中的其余块。
【讨论】:
ets.erl 中的代码,但没有提到:P。我用这些信息更新了答案。