erlang ets BIF实现ets_new_2为什么这样做?

时间:2013-10-16 02:06:21

标签: erlang ets

R16B02 erl_db.c:1272

/* we create table outside any table lock
 * and take the unusal cost of destroy table if it
 * fails to find a slot 
 */
{
    DbTable init_tb;

    erts_smp_atomic_init_nob(&init_tb.common.memory_size, 0);
    tb = (DbTable*) erts_db_alloc(ERTS_ALC_T_DB_TABLE,
                                  &init_tb, sizeof(DbTable));
    erts_smp_atomic_init_nob(&tb->common.memory_size,
                             erts_smp_atomic_read_nob(&init_tb.common.memory_size));
}

我的Qus。为什么这样? init_tb只使用common.memory_size字段。为什么不使用int替换?

1 个答案:

答案 0 :(得分:0)

希望我理解你的实际问题..

正如我们从代码本身可以了解的那样,erlang VM采用SMP模式(简单地说,多个erlang调度程序在多个内核上)。 在这种情况下,最好的方法(性能明智)是使用原子操作而不是锁。在内部,您指向的操作可能使用原生CAS [http://en.wikipedia.org/wiki/Compare-and-swap](Compare And Swap)操作。