6.824 Raft Lab2B
实验做什么?
- 上回L ab 2A做的是
leader election
- 而这次的Lab 2B主要做的是
log replication
- 程序结构只增加一个go程。这个go程循环检查commitIndex是否大于lastApplied。也就是说,检查有没有新近被commit的log项。如果有,就lastApplied++,然后向applyCh发送ApplyMsg消息。
- 因为向chan发消息可能会阻塞。课程指南教大家用sync.Cond解决。sync.Cond是条件变量,在操作系统课程里都有讲,一般是和管程(monitor)一起介绍的。
条件变量
- 条件变量的作用是当你持有一个锁(Mutex)时,你还想要等待一个条件成立。而这个条件的改变需要另外一个线程执行(这个线程它同样想持有这个锁)。所以,条件变量的Wait()方法会释放锁(Mutex)然后睡觉等通知,让其他线程可以进入临界区。然后其他线程觉得条件可能满足了,它就调用Broadcast()方法,通知睡觉的进程醒来,检查一下条件是否成立了。因为醒来的时候条件未必成立,所以检查和Wait()要搞成一个循环:
for !condition {
c