0

在 tasklet_action 例程中 - 在处理来自 tasklet_vec

核心列表的条目时,我们正在原子地读取 atomic_read(&t->count),我
在整个例程中看不到它的任何用途,它有什么意义?

if (tasklet_trylock(t)) { // check is it is not already being executed
        if (!atomic_read(&t->count)) {
            if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
                BUG();
            t->func(t->data); // call tasklet action routine
            tasklet_unlock(t);
            continue;
        }
        tasklet_unlock(t);
    }
4

1 回答 1

0

如果计数不等于 0,则 tasklet 被视为已停用/禁用。

在某些体系结构中,读取操作不会发生在单个汇编指令中。例如,如果您正在读取 64 位值,编译器可能会使用两条汇编加载指令来实现读取,这样第一条指令读取低 32 位,第二条指令读取高 32 位。这反过来又会导致竞争条件。因此,原子读取是首选。

于 2015-10-20T16:40:11.613 回答