Здравствуйте есть такой класс
class CCashCode
{
public:
.....................................
private:
boost::thread m_WorkThread;
boost::mutex m_Mutex;
boost::condition m_Cond;
bool m_bStop;
bool m_bWork;
конструктор:
CCashCode::CCashCode():
m_bStop(false),
m_bWork(false),
m_Mutex(),
m_Cond(),
m_WorkThread(boost::bind(&CCashCode::Execute, this))
{
и метод Execute
void CCashCode:: Execute(){
while(true)
{
{
boost::mutex::scoped_lock lock(m_Mutex);
while(!m_bStop && !m_bWork){
LOGINFO<<"Wait"; //??????????????????
m_Cond.wait(lock);
}
if(m_bStop)
break;
}
....................................................
void CCashCode ::InitCashCode(){
{
boost::mutex::scoped_lock lock(m_Mutex);
m_bWork=true;
}
m_iType=INIT;
m_Cond.notify_one();
}
Иногда при запуске программы в лог записывалась три раза "Wait"; И при вызове метода InitCashCode() программа зависала в boost::mutex::scoped_lock lock(m_Mutex); В отладке иногда такая ситуация повторялась и вылетал ексепшен, происходило в методе Execute()обрашение к еще не с инициализированному объекту m_Mutex; Хотя вроде в конструкторе класса CCashCode задан порядок инициализации. Проблему решил так:
private:
class CCashCode
{
public:
.....................................
AutoPtr<boost::thread> m_WorkThread;
..........................................................
и в конструкторе:
CCashCode::CCashCode():
m_iType(INIT),
m_iSum(0),
m_bStop(false),
m_bWork(false)
{
m_WorkThread=new boost::thread(boost::bind(&CCashCode::Execute, this));
...................................................................
После этого проблема исчезла. Но все ровно интересно, почему так происходило
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте есть такой класс
А>
А>class CCashCode
А>{
А>public:
А>.....................................
А>private:
А> boost::thread m_WorkThread;
А> boost::mutex m_Mutex;
А> boost::condition m_Cond;
А> bool m_bStop;
А> bool m_bWork;
А>
А>конструктор:
А>А>CCashCode::CCashCode():
А> m_bStop(false),
А> m_bWork(false),
А> m_Mutex(),
А> m_Cond(),
А> m_WorkThread(boost::bind(&CCashCode::Execute, this))
А>{
А>
Члены объекта создаются не в том порядке, в котором они перечислены в конструкторе, а в том порядке, в котором они перечислены в объявлении класса.
Поток надо объявить последним:
А> boost::mutex m_Mutex;
А> boost::condition m_Cond;
А> bool m_bStop;
А> bool m_bWork;
А> boost::thread m_WorkThread;