使用boost线程:发出信号并等待终止

时间:2014-08-01 14:32:08

标签: c++ multithreading boost

我目前正在编写一个c / c ++ dll以供以后在Delphi中使用,我对Delphi中的线程比c / c ++更熟悉,尤其是boost。所以我想知道如何实现以下场景?

class CMyClass
{
    private:
        boost::thread* doStuffThread;
    protected:
        void doStuffExecute(void)
        {
            while(!isTerminationSignal()) // loop until termination signal
            {
                // do stuff
            }

            setTerminated(); // thread is finished
        };
    public:
        CMyClass(void)
        {
            // create thread
            this->doStuffThread = new boost::thread(boost::bind(&CMyClass::doStuffExecute, this));
        };

        ~CMyClass(void)
        {
            // finish the thread
            signalThreadTermination();
            waitForThreadFinish();

            delete this->doStuffThread;

            // do other cleanup
        };
}

我有关于提升线程,信号和互斥量的红色无数文章,但我不明白,可能是因为它是星期五;)或者我认为这样做是不可行的?

此致 丹尼尔

1 个答案:

答案 0 :(得分:8)

只需使用原子布尔值告诉线程停止:

class CMyClass
{
private:
    boost::thread doStuffThread;
    boost::atomic<bool> stop;
protected:
    void doStuffExecute()
    {
        while(!stop) // loop until termination signal
        {
            // do stuff
        }

        // thread is finished
    };
public:
    CMyClass() : stop(false)
    {
        // create thread
        doStuffThread = boost::thread(&CMyClass::doStuffExecute, this);
    };

    ~CMyClass()
    {
        // finish the thread
        stop = true;
        doStuffThread.join();

        // do other cleanup
    };
}

要等待线程完成,只需加入它,它将阻塞直到它完成并可以加入。无论如何你需要加入线程才能销毁它,否则它将终止你的程序。

无需使用指针并使用new创建线程,只需直接使用boost::thread对象即可。在堆上创建所有东西都是浪费,不安全和糟糕的风格。

无需使用boost::bind将参数传递给thread构造函数。许多年来boost::thread支持直接将多个参数传递给它的构造函数,并且它在内部进行绑定。

在创建新线程之前将stop初始化为false非常重要,否则如果新线程很快生成,它可以检查{{1}的值在它初始化之前,可能会从未初始化的内存中读取stop值,然后它永远不会进入循环。

关于风格,许多C ++程序员认为写true是令人恶心的憎恶。如果你想说你的函数没有参数,那就写foo(void)