1

我正在运行一小段代码,这些代码偶尔会(很少)在我的 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 方法有关的任何内容。

任何人都知道在这么少的代码之后可能导致这两种方法访问冲突的原因是什么?

4

2 回答 2

2

永远不要释放TThread仍在运行的。基类TThread析构函数在这方面是不安全的。它做了一些非常愚蠢的事情,可能会导致问题。始终确保 aTThread在释放它之前完全终止。使用该WaitFor()方法,或等到WaitForSingleObject()报告WAIT_OBJECT_0

于 2011-10-05T00:12:03.927 回答
1

首先,不要使用Base->Free(). 改为使用delete Base;

更重要的是,您应该调用Base->WaitFor()afterTerminate()以确保它在删除对象之前实际终止。

Base->Terminate();
Base->WaitFor();
delete Base;

否则,您将过早地删除线程对象(您的代码/RTL 可能仍在使用),从而导致偶尔的访问冲突。

或者您可以将该FreeOnTerminate属性设置为 true 并完全忘记等待/删除对象(如果您有太多线程,请注意虚拟内存用完,因为还没有 64 位版本的 C++ Builder)。

于 2011-10-04T23:55:02.127 回答