我目前正在编写一个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
};
}
我有关于提升线程,信号和互斥量的红色无数文章,但我不明白,可能是因为它是星期五;)或者我认为这样做是不可行的?
此致 丹尼尔
答案 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)
。