读书人

怎么给线程传递参数

发布时间: 2012-04-21 14:34:44 作者: rapoo

如何给线程传递参数
全局变量什么的自不必说,我想问的是需要临时构造的那种小结构体参数。


我以前是在调用前new,然后在线程中复制参数,然后delete。但这样做好像不太好吧,比如正复制着呢,线程被终止了啥的。

应该怎么做?

[解决办法]
原则上来说是谁申请谁释放的,不过一般情况下就用你原来的方法挺好,否则还需要管理线程状态,有点得不偿失。

出现线程被终止这种情况本来就属于非正常状态了,内存泄露就泄露了吧,管它……
就算你在其它线程管理内存,那是不是要考虑管理线程被终止的状态……

如果你要考虑到将线程单独做到DLL里面,另当别论,肯定谁申请谁释放比较合适。
[解决办法]
临界区或者锁是否能解决,或想法和数据库中的原子操作一样,必须执行完这个原子操作线程才能退出 否则不能退出。
[解决办法]
不能。线程中没有办法阻止自己被停止的操作。

探讨

临界区或者锁是否能解决,或想法和数据库中的原子操作一样,必须执行完这个原子操作线程才能退出 否则不能退出。

[解决办法]
互斥区是你创建的一个内存区域,可以创建几个管理内存的函数来对子线程所需的内存对象进行申请与管理。这几个函数应该至少提供ReleaseAll()和PreAlloc()函数(函数名字只是举例)来对子线程需要的变量做分配和释放。而这几个函数应该和子线程函数处在同一个DLL文件或EXE中,以免造成内存使用问题。

创建线程时,主线程应该使用类似以下的结构
HANDLE hMem = PreAlloc(); // HANDLE是自定义的一个数据类型,最好是指针或数字,这样才能传给子线程。
_beginThread(..., hMem...);

而在子线程中,应该使用新的函数来对内存对象进行访问
例如 My_Alloc()之类,如果是新建对象,更为复杂一点……

在重启线程或线程被强制结束后,应使用
ReleaseAll(hMem)来对内存进行释放。当然,在释放之前,别忘了使用WaitForSingleObject来对线程状态进行检测。

在分配与释放函数中,为了多线程安全,可以将函数内部加上互斥锁。

以上的方法仅限于你只能用Terminate来结束线程,而线程内部又有额外的内存开销需要释放的这种特殊情况下才能够用。

而这个过程其实将线程的管理复杂化了,对于一般的线程来说,均是不需要这样复杂的管理机制的。这里只是针对你可能需要的特殊情况而进行探讨。

事实上,貌似和你现在遇到的问题离得有点远了,呵呵……

探讨
引用:

楼主如果想要在执行过程中允许被打断,建议使用共享标志变量的做法,即线程在运行过程中轮循标志位来获取退出信号,在需要退出的时候自行return,而不是由别的线程来Terminate。

如果你的线程只能用Terminate来退出才能获得较高的效率或其它想得到的特性,那可以考虑将内存分配、内存释放的操作通通放到由互斥量管理的共享区,由主线程在创建子线程前主动调用内存……

读书人网 >VC/MFC

热点推荐