工作者线程相关问题一问
在工作者线程中,一般会传进来一个参数。比如
UINT mythreadProc(LPVOID myInfo)
这个myInfo一般是在主线程中分配空间的。有两中方法:
一种是采用new方法,在heap中开辟一块空间,然后传给子线程,子线程(即工作者线程)完工后,释放(delete)这块空间。但问题是:如果我这时候,直接关闭程序的话,这个内存实际上并没有得到释放(因为线程被强行关闭了),需要操作系统在对进程做善后处理才能完成该内存的释放,而我想自己完整控制对内存的释放。这样的话,采用什么方法好呢?当然,我可以在关闭系统的时候,等待所有的线程自然结束以后,在关闭整个进程,但这样的缺点是我要等,但一般“我”(是实际的用户)是不愿意等的。当然可以采用EVENT进行同步,通过激发事件,告诉工作者线程,你快结束,释放相关空间,因为我要退出了,但是还有问题,比如我在主线程中可以产生该工作者线程N次,但我如何为每一个工作者线程设置一个同步对象呢?(因为工作者线程只是一个函数而已,而不是C++对象),还是一个同步对象可以为所有的工作者线程使用呢?这个需要高手指点。
第二种就是采用局部变量(也就是在stack)中分配一个myInfo,然后传给子线程,但这有一个问题就是,当该调用工作者线程的局部函数退出后,会释放该局部变量(myInfo),那么说还是需要在工作者线程那边把个myInfo拷贝一份,这样还是会涉及到释放问题,尤其是如果myInfo结构中包含一些Handle对象的话。
大家在具体编程的时候,是如何解决我提到的这个问题的呢?请指教。