问题一:
在介绍RCU锁的文章中,他写了一个发布-订阅机制。但是我有一个关于rcu_assign_pointer()的问题,在这篇文章中,他说:
1 p->a = 1;
2 p->b = 2;
3 p->c = 3;
4 rcu_assign_pointer(gp, p);
rcu_assign_pointer() 将发布新结构,强制编译器和 CPU 在分配给 p 引用的字段之后执行对 gp 的分配。
但是编译器和CPU怎么知道p已经被赋值了呢?比如我只是初始化了p->a和p->b,那么编译器和CPU如何区分这两种情况呢?
situation 1:
1 p->a = 1;
2 p->b = 2;
3 p->c = 3;
4 rcu_assign_pointer(gp, p);
situation 2:
1 p->a = 1;
2 p->b = 2;
3 rcu_assign_pointer(gp, p);
问题2:
至于读端临界区,如果有连续的reader读取数据,是writer必须等待还是writer不能进行同步操作?如果是,读者会一直阅读旧版本吗?