I hate Condition Variables

我讨厌条件变量。条件变量应当尽可能避免被使用。一旦使用了条件变量,就意味着你需要call它的wait方法。这就像Sleep一样,会让当前线程陷入睡眠,白白浪费掉。而且使得当前线程不易被cancel。在唤醒的时候,如果实现不当,常常会“惊群”或者丢失更新(lost signal)。条件变量的wait是wait on single object,这样是不好的。不能多路复用。要尽可能的wait on multiple object。很多程序之所以不能干净的退出就是因为滥用了条件变量,tensorflow就是一个例子。

所以,更好的做法是把条件变量被唤醒后要做的事情包装成线程池里的一个task, 由调用notify方法的线程把这个task扔到线程池里。这样cancel起来其实也很容易,只要给这个task设置一个标志位,在把这个task扔进线程池之前和开始执行之前各检测一次就好了。最后,程序会变成被一大串async callback串起来。虽然先后逻辑看起来不再那么直观,但是画个图、写写文档也就好了。

我一般只有在main函数中才可能会使用条件变量。目的是等待child threads结束。


此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥