safe_fixtable(Table, Fix) -> true
Table = table()
Fix = boolean()
修复表的类型set
,bag
, 或者duplicate_bag
为了安全穿越使用first/1
&next/2
,match/3
&match/1
,match_object/3
&match_object/1
, 或者select/3
&select/1
.
进程通过调用 safe_fixtable(Table, true)
修复表。该表保持固定状态,直到进程通过调用 safe_fixtable(Table, false)
释放它,或者直到进程终止。
如果许多进程修复了一个表,则该表将保持固定状态,直到所有进程都释放它(或终止)。每个进程都会保留一个引用计数器,N 个连续的修复需要 N 个版本来释放该表。
当表固定时,一系列first/1
和next/2
即使在遍历过程中删除了键,调用也能保证成功。遍历期间插入或删除的对象的键可能会或可能不会返回next/2
取决于表中键的顺序以及该键当时是否存在next/2
叫做。
例子:
clean_all_with_value(Table,X) ->
safe_fixtable(Table,true),
clean_all_with_value(Table,X,ets:first(Table)),
safe_fixtable(Table,false).
clean_all_with_value(Table,X,'$end_of_table') ->
true;
clean_all_with_value(Table,X,Key) ->
case ets:lookup(Table,Key) of
[{Key,X}] ->
ets:delete(Table,Key);
_ ->
true
end,
clean_all_with_value(Table,X,ets:next(Table,Key)).
请注意,在固定表被释放之前,已删除的对象不会从固定表中释放。如果一个进程修复了一个表但从未释放它,则被删除的对象使用的内存永远不会被释放。表上操作的性能也会显著下降。
要检索有关哪些进程已修复哪些表的信息,请使用
info(Table, safe_fixed_monotonic_time)
。具有许多修复表的进程的系统可能需要一个监视器,以便在表修复时间过长时发送警报。
请注意safe_fixtable/2
对于表类型来说不是必需的ordered_set
对于由单个 ETS 函数调用完成的遍历,例如select/2
.
相关用法
- erlang safe_relative_path(Filename, Cwd)用法及代码示例
- erlang safeInflate(Z, Data)用法及代码示例
- erlang sin用法及代码示例
- erlang str用法及代码示例
- erlang substr用法及代码示例
- erlang sort用法及代码示例
- erlang sublist用法及代码示例
- erlang sum用法及代码示例
- erlang split_binary用法及代码示例
- erlang self用法及代码示例
- erlang spawn用法及代码示例
- erlang spawn on Node用法及代码示例
- erlang spawnlink用法及代码示例
- erlang select(Table, MatchSpec)用法及代码示例
- erlang select_replace(Table, MatchSpec)用法及代码示例
- erlang select_reverse(Continuation)用法及代码示例
- erlang split(Filename)用法及代码示例
- erlang setelement(Index, Tuple1, Value)用法及代码示例
- erlang size(Item)用法及代码示例
- erlang spawn(Module, Function, Args)用法及代码示例
- erlang split_binary(Bin, Pos)用法及代码示例
- erlang statistics(Item :: garbage_collection)用法及代码示例
- erlang statistics(Item :: microstate_accounting)用法及代码示例
- erlang statistics(Item :: reductions)用法及代码示例
注:本文由纯净天空筛选整理自erlang.org大神的英文原创作品 safe_fixtable(Table, Fix) -> true。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。