【问题标题】:Are ETS bulk operations atomic?ETS 批量操作是原子操作吗?
【发布时间】:2018-01-06 11:45:03
【问题描述】:

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

【问题讨论】:

  • 您的意思是tab2file 而不是tab2list
  • 两者,我希望他们有相同的保证或缺乏保证。

标签: erlang ets


【解决方案1】:

基于文档here

内部遍历表的函数,如selectmatch,提供与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.erlets:tab2file/3 的代码使用ets:select/3 获取第一个块,然后使用ets:select/1 获取表中的其余块。

【讨论】:

  • 我不相信这些文档回答了这个问题。不清楚 tab2x 和 x2tab 是否使用 select/match、safe_fixtable 或其他机制。
  • @knite 你是对的,我遵循了ets.erl 中的代码,但没有提到:P。我用这些信息更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多