boost thread
От: Аноним  
Дата: 26.09.07 09:54
Оценка:
Здравствуйте есть такой класс


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));
...................................................................


После этого проблема исчезла. Но все ровно интересно, почему так происходило
Re: boost thread
От: remark Россия http://www.1024cores.net/
Дата: 26.09.07 10:00
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте есть такой класс


А>

А>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;



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.