以下是include/linux/rculist.h中os.path.normpath(os.path.join(filepath, '../../..'))
的实施:
__list_add_rcu
在函数体内, rcu-lock 保护static inline void __list_add_rcu(struct list_head *new,
struct list_head *prev, struct list_head *next)
{
new->next = next;
new->prev = prev;
rcu_assign_pointer(list_next_rcu(prev), new);
next->prev = new;
}
的更新,但prev->next
没有保护。为什么?我在这里错过了什么明显的东西吗?
答案 0 :(得分:3)
RCU-lock 无法保证双向遍历列表的正确性。
简而言之,这样的保证需要立即“保护”两个指针(next->prev
和prev->next
) 。但是 RCU-section不是一个独占的部分,所以两个指针有可能让它们之间的值不一致。
正因为如此, RCU仅保证前向列表遍历的正确性。为此,仅保护prev->next
就足够了。
提示:虽然有反向列表遍历的宏(例如list_for_each_entry_reverse
),但这些宏没有RCU对位。这只是因为RCU不支持这种遍历类型。