线程和线程对象的处理
先来个线程类的代码
#include <windows.h>
class Thread
{
public:
bool Start();
void End();
void Wait();
void AskForEnd();
public:
Thread();
~Thread();
private:
HANDLE hThread;
protected:
bool running;
private:
static DWORD WINAPI ThreadProc(LPVOID lpParameter);
protected:
virtual void OnRun() = 0;
};
bool Thread::Start()
{
if(hThread != NULL)
return false;
running = true;
hThread = CreateThread(NULL, 0, ThreadProc, this, 0, NULL);
if(hThread == NULL)
{
running = false;
return false;
}
return true;
}
void Thread::AskForEnd()
{
if(hThread == NULL)
return;
running = false;
}
void Thread::End()
{
if(hThread == NULL)
return;
Wait();
CloseHandle(hThread);
hThread = NULL;
}
void Thread::Wait()
{
if(hThread == NULL)
return;
WaitForSingleObject(hThread, INFINITE);
}
Thread::Thread()
{
hThread = NULL;
running = false;
}
Thread::~Thread()
{
}
DWORD WINAPI Thread::ThreadProc(LPVOID lpParameter)
{
Thread* _this = (Thread*)lpParameter;
_this->OnRun();
return 0;
}
线程和线程对象如何组织到一起, 是我想了很久的一个问题.
问题: 如果线程对象释放掉了, 线程却还是在访问这个对象的成员, 就会崩溃了.
以前的解决办法:
就是使用引用计数的方法做的.
线程间传递对象那时, AddRef() (增加引用)
某个线程不用了这个对象, Release() (减少引用)
当对象不需要了, 即计数为0, 对象就释放了.
现在的想法是(使用上述代码):
父线程与子线程之间遵守一些协议:
(1)父线程确保自己结束那时, 所有它的子线程都要正常退出.
(2)父线程确保子线程退出后, 它自己持有的子线程对象才释放掉
(3)子线程确保感受到running为false那时, 应该尽快地退出线程
(4)父进程应该持有子线程对象, 当然子线程也可以持有父进程对象指针, 而且线程间也只能够使用这种持有方式.(这种方式可能影响效率, 但是能确保线程间的安全)
这两个都是不错的想法,当然可以组合这两种方法.
第一个是编程方法上面的解决, 第二个是线程模型上面定义的准则. 个人认为, 第二个也是必须遵守的, 我们的程序才写得简洁,漂亮~
浙公网安备 33010602011771号