當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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