我正在运行一小段代码,偶尔(很少)在我的TThread的终止/释放位置上发生访问冲突。我正在运行这些线程的许多实例,但该位置似乎是唯一导致问题的实例,并且每500个左右调用仅发生一次。
TThreadInheritor* Base= new TThreadInheritor(1);
try {
Base->Start();
WaitForSingleObject((HANDLE)Base->Handle, 1000);
MyBaseId = Base->scanvalue;
}__finally {
Base->Terminate();
Base->Free();
}
终于把它扔进我了。我的第一个猜测是,WaitForSingleObject正在以一种怪异的方式超时,并导致Terminate和Free困惑,但是我不太确定会如何发生。从TThread继承时,我与Terminate / Free方法没有任何关系。
谁知道这么少的代码就能导致这两种方法访问冲突?
最佳答案
永远不要释放仍在运行的TThread
。在这方面,基类TThread
析构函数并不安全。它做一些非常愚蠢的事情,可能会导致问题。释放之前,请务必确保TThread
已完全终止。使用WaitFor()
方法,或等待WaitForSingleObject()
报告WAIT_OBJECT_0
。
关于c++ - TThread访问违反终止/释放,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7655294/