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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。