class CSafeQuit
{
public:
CSafeQuit();
virtual ~CSafeQuit();
LONG AddRef( void );
LONG ReleaseRef( void );
void StartThread();
void ExitThread();
DWORD work_fun();
static unsigned int __stdcall work_thread(LPVOID lpVoid);
private:
LONG volatile m_nRef;
std::mutex m_mutex;
std::condition_variable m_cv;
HANDLE m_handle;
bool m_bExitThread;
}
CSafeQuit::CSafeQuit()
{
m_handle = nullptr;
m_bExitThread = false;
}
CSafeQuit::~CSafeQuit(){}
LONG CSafeQuit::AddRef( void )
{
return InterlockedIncrement( &m_nRef );
}
LONG CSafeQuit::ReleaseRef( void )
{
LONG lRet = InterlockedDecrement( &m_nRef );
if( !lRet )
{
delete this;
}
return lRet;
}
void CSafeQuit::StartThread()
{
if(m_handle == nullptr)
{
AddRef();
m_handle = (HANDLE)_beginthreadex(NULL, 0, work_thread, this, 0, 0);
}
}
void CSafeQuit::ExitThread()
{
m_bExitThread = true;
ReleaseRef();
}
unsigned int __stdcall CSafeQuit::work_thread(LPVOID lpVoid)
{
CLocalRenderInfo* pThis = (CLocalRenderInfo*)lpVoid;
if (pThis)
{
pThis->work_fun();
pThis->ReleaseRef();
}
return 0;
}
DWORD CSafeQuit::work_fun()
{
while (true)
{
if (m_bExitThread)
{
break;
}
std::unique_lock<std::mutex> lock(m_mutex);
m_cv.wait(lock, [this]() {
return (true|false);
});
//do something
}
return 0;
}
一个简单的多线程控制框架
最新推荐文章于 2023-07-17 17:33:24 发布