我正在运行一小段代码,偶尔(很少)会在终止/免费的TThread上访问违规。我正在运行这些线程的许多实例,但这个地方似乎是唯一导致问题的地方,而且只有每500个左右的呼叫才会这样做。
TThreadInheritor* Base= new TThreadInheritor(1);
try {
Base->Start();
WaitForSingleObject((HANDLE)Base->Handle, 1000);
MyBaseId = Base->scanvalue;
}__finally {
Base->Terminate();
Base->Free();
}
终于被扔进了我的脑海里。我的第一个猜测是WaitForSingleObject以一种奇怪的方式超时并导致终止和自由陷入困境,但我不太确定会发生什么。当我从TThread继承时,我没有改变与Terminate / Free方法有关的任何内容。
任何人都知道在这么少的代码之后会导致这两种方法访问的原因是什么?
答案 0 :(得分:2)
永远不要释放仍在运行的TThread
。在这方面,基类TThread
析构函数不安全。它做了一些非常愚蠢的事情,可能会导致问题。始终确保TThread
在释放之前完全终止。使用WaitFor()
方法,或等到WaitForSingleObject()
报告WAIT_OBJECT_0
。
答案 1 :(得分:1)
首先,请勿使用Base->Free()
。请改用delete Base;
。
更重要的是,您应该在Base->WaitFor()
之后调用Terminate()
以确保在删除对象之前实际终止它。
Base->Terminate();
Base->WaitFor();
delete Base;
否则,您将过早地删除线程对象(您的代码/ RTL可能仍在使用),从而导致偶尔的访问冲突。
或者你可以将FreeOnTerminate
属性设置为true并忘记完全等待/删除对象(尽管你有太多线程因为没有64位版本的C ++而要小心虚耗尽生成器)。