我正在运行一小段代码,偶尔(很少)在我的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/

10-10 04:50