pthread 条件变量 是个很危险的东西

本文从WordPress迁移而来, 查看全部WordPress迁移文章

一个最简单的例子吧

变量count初始化为0,2个工作线程对一个变量count每次做+1操作,当count能被3整除时,条件成立,唤醒一个监听线程,打印出当前的count值;看似简单的一个的问题,至少目前搜索引擎上没看到完全成功的代码,原因在与

1
2
3
4
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
do_something();
pthread_mutex_unlock(&mutex);
1
pthread_cond_wait(&cond,&mutex);

的内部是先对mutex解锁,等待条件,成立后唤醒,并且对mutex加锁;

问题在这个加锁;此时并不止一个线程在申请加锁(除了这个监听线程,其他的工作线程也在申请加锁,这里是只有2个工作线程,已经偶尔会出问题,如果工作线程更多,更有问题),所以可能轮不到监听线程加锁!这变为一个很危险的问题:条件成立了,理应从wait中返回,但不能返回,等返回时,已经错过时机,这在逻辑上是错误的;

例如本题是要求在count能被3整除时返回,但抢不了锁,wait返回时可能已经不能被3整除