我正在尋找一個基類中的線程,該基類不斷調用被派生類覆蓋的類中的純虛方法。帶純虛擬回調的螺紋基類,停止銷燬C++
對於啓動線程,我沒有問題,因爲我可以在構建完成後調用HasInitalized()函數。因此,線程在完全構建完成後啓動。
但是,由於類的生命期由shared_ptr管理,因此我無法調用類似的方法來停止線程。如果我在析構函數中停止線程,它將導致seg-fault,因爲派生類在基類之前被銷燬,因此會嘗試調用不存在的函數。
我知道我可以從派生類調用停止函數,但不必在每個派生類的實例。
有沒有辦法解決這個問題。
例子:
#include "boost/thread.hpp"
class BaseClass
{
public:
BaseClass()
{
}
// Start the thread
void Start()
{
_thread = boost::thread(&BaseClass::ThreadLoop, this);
}
virtual ~BaseClass()
{
_thread.interrupt();
_thread.join();
}
private:
// Will loop until thread is interupted
void ThreadLoop()
{
try
{
while(true)
{
DoSomethingInDerivedClass();
boost::this_thread::interruption_point();
}
}
catch(...)
{
}
}
boost::thread _thread;
protected:
virtual void DoSomethingInDerivedClass() = 0;
};
class DerivedClass : public BaseClass
{
DerivedClass()
{
}
~DerivedClass()
{
// This gets called before base class destructor.
}
protected:
void DoSomethingInDerivedClass();
};
在任何情況下,您都將在派生對象和基礎上進行多態處理。所以,掛起線程的邏輯必須從Derived類析構函數中調用。實現懸架/螺紋閉合的實際功能可以在Base類中實現。 – Arunmu
你應該重新考慮你的設計。你的派生類至少有兩個職責。線程控制繼承自基礎和您的算法來完成這項工作。你應該把它分開。將派生類通過接口傳遞給Thread類。這將避免這個問題。 – mkaes
我認爲你的設計/策略是不正確的,但它看起來不正確。 – Arunmu