Boost logo

Boost :

From: ÉêºÍƽ (hp.shen_at_[hidden])
Date: 2008-01-26 02:44:57


Hi, all

 

I got a runtime erro when try to stop a boost thread.

I created a class(listed below) to wrap boost thread, and used it like this:

 

ThreadWrapper tw(1);//delay 1 seconds

tw.start();

¡­

tw.stop();

When I called the function ¡°stop¡±, a runtime error jump out said access
conflict when running the line(in once.cpp,Line 163):

 

HANDLE mutex = CreateMutexA(NULL, FALSE, strm.str().c_str());

 

I¡¯ve tried the class in two MFC project. One has error, and the other one
ran correctly.

How strange!

Is it a bug of boost?

Please help me.

 

 

//==========================================================================
==

#include <boost/thread.hpp>

#include <boost/bind.hpp>

class ThreadWrapper

{

public:

    ThreadWrapper(unsigned delySec=0)

{

        m_delySec = delySec;

m_pause = false;

        m_stop = false;

    }

public:

    virtual ~ThreadWrapper(void)

    {

    }

protected:

    boost::mutex m_mutex;

    boost::condition m_cond;

    bool m_stop;

    bool m_pause;

    unsigned m_delySec;

 

public:

    virtual void start()

    {

        boost::thread mtth(boost::bind(&ThreadWrapper::run, this));

    }

    virtual void pause()

    {

        boost::mutex::scoped_lock lock(m_mutex);

        m_pause = true;

        m_cond.notify_one();

    }

    virtual void resume()

    {

        boost::mutex::scoped_lock lock(m_mutex);

        m_pause = false;

        m_cond.notify_one();

    }

    virtual void stop()

    {

        boost::mutex::scoped_lock lock(m_mutex);

        m_stop=true;

        m_cond.notify_one();

                   //I tried join, but still got the same error

    }

    virtual void run()

    {

        while(m_stop == false)

        {

            if (m_pause == true)

            {

                boost::mutex::scoped_lock lock(m_mutex);

                while(m_pause == true)

                {

                    m_cond.wait(lock);

                }

            }

            boost::xtime xt;

            boost::xtime_get(&xt, boost::TIME_UTC);

            xt.sec += m_delySec;

            boost::thread::sleep(xt);

        }

    }

}

//==========================================================================
==

 


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk