当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


erlang safe_fixtable(Table, Fix)用法及代码示例


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/1next/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.org大神的英文原创作品 safe_fixtable(Table, Fix) -> true。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。