线程和线程对象的处理

先来个线程类的代码

#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)父进程应该持有子线程对象, 当然子线程也可以持有父进程对象指针, 而且线程间也只能够使用这种持有方式.(这种方式可能影响效率, 但是能确保线程间的安全)

 

这两个都是不错的想法,当然可以组合这两种方法.

第一个是编程方法上面的解决, 第二个是线程模型上面定义的准则. 个人认为, 第二个也是必须遵守的, 我们的程序才写得简洁,漂亮~

posted @ 2011-11-06 19:17  yanjielong  阅读(889)  评论(0)    收藏  举报