好吧,本文也标题党了一回。因为在boost开发者眼里,这肯定不是bug,甚至算不上flaw,而是character,详见#2219This works as designed云云。如果搞懂原理后正确使用也一切OK,不过我觉得作为一个高质量的库,不应该对开发者提出这么高的要求,另外这个问题让我半夜调试鸡飞狗跳,难免带些情绪,所以姑且称其为bug吧。
先说几句题外话:条件变量是并发开发的一大利器。君不见java提供的基本同步机制只有synchronize(相当于同线程可重入的临界区recursivemutex)和wait/notify(这就是条件变量了),虽然还有其他几个同步原语,但是都是deprecate的。使用条件变量开发并发应用的最大优势是更容易做对,也更容易阅读理解。并发应用是很难调试的,有的bug可以潜伏很久直到哪天把程序崩掉,所以这两点是很关键的。boost的thread库提供有recursive_mutex、condition_variable和condition_variable_any。condition_variable_any可以作用于任意的mutex,那是不是利用boost::recursive_mutex和boost::condition_variable_any,就可以programmingc++ like java ? 在今天之前我是这么认为的,但事实证明没这么简单。
先来看一个例子:
#include "xttime.h"
#include <iostream>
#include <boost/thread.hpp>
using namespace std;
class TestVC
{
public:
TestVC()
{
running_flag =true;
}
void stop()
{
running_flag = false;
{
boost::recursive_mutex::scoped_locklock(mtx);
cond.notify_all();
}
}
void waitSignalThread()
{
boost::recursive_mutex::scoped_locklock(mtx);
while(running_flag)
{
cout<< "start wait signal"<< endl;
cond.wait(mtx);
cout<< "finish wait signal"<< endl;
}
}
void emitSignalThread()
{
while (running_flag)
{
{
boost::recursive_mutex::scoped_locklock(mtx);
cout << "startemit singal" << endl;
cond.notify_all();
cout << "finishemit signal" << endl;
}
global::sleepms(10);