(来自一篇关于 LWN 的文章)

 1 rcu_read_lock();
 2 list_for_each_entry_rcu(p, head, list) {
 3   do_something_with(p->a, p->b, p->c);
 4 }
 5 rcu_read_unlock();

RCU 更新操作将执行 synchronized_rcu() 以断言每个 CPU 切换了上下文,因此每个 RCU 阅读器都完成了它的工作。但是 RCU 必须依赖于读者不被抢占。事实上,LWN 接下来说:



我知道非 CONFIG_PREEMPT 内核禁用了抢占,但为什么 CONFIG_PREEMPT 内核也可以?

最佳答案

在 CONFIG_PREEMPT 内核上是可以的,因为在任务被抢占之前要小心完成 rcu 读取临界区。调度器检查当前任务是否在 rcu 读临界区,如果是,它提高优先级以完成临界区。有关更多详细信息,请参阅此文章:http://lwn.net/Articles/220677/

关于c - 如何保护 RCU 阅读器部分不被抢占?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32260422/

10-09 08:38