为什么在tasklet结构中使用原子读取来计算变量?

时间:2015-10-16 09:19:40

标签: kernel interrupt tasklet softirq

在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);
    }

1 个答案:

答案 0 :(得分:0)

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

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