【发布时间】:2014-10-17 09:02:36
【问题描述】:
我有一项任务,我必须做一些繁重的 CPU/RAM 工作。有了这个结果,我必须做一些数据库请求。所有这些我必须做几千次,所以我在后台线程中做。现在我正在考虑将每个任务分成两个部分并将它们拆分为 2 个单独的线程,这样第一个线程就不必等待数据库请求完成。然后它可以在第二轮等待第一轮的数据库请求时为第二轮做 CPU/RAM 的工作,一切都会加快。
现在,从第一个 TThread 后代中实例化第二个 TThread 后代是否安全?还是我需要从 MainThread 中实例化 TThread 后代?我可以两者都做,但在我的情况下,从第一个线程中实例化第二个线程会更容易,并且它将遵循 oop 范式,因为第二个线程对程序的其余部分是透明的。
【问题讨论】:
-
绝对安全。
-
我从来没有假设 VCL 的东西是线程安全的,而且 TThread 是如此复杂,以至于我懒得自己检查它的线程安全性。此外,由于 TThread 的复杂性,这更容易出错。
-
VCL 无关紧要。 TThread 不是 VCL 组件。 VCL 缺乏线程安全与设计时无关。它继承自Win32的底层框架。现在 Win32 是线程安全的,但窗口与创建它们的线程有关联。输入队列是面向线程的。因此,Win32 GUI 框架将引导您访问在主线程中运行的所有 Win32 GUI 代码。 VCL 只是继承了它。
-
@MartinJames 那是 .net 而不是 VS 是迂腐的。尤其是 WinForms。它的设计与 VCL 非常相似。 WPF 虽然有点不同,但更宽容。
-
@RSE: VCL = Visual Component 库。 TThread 是 RTL(Run Time 库)的一部分。 VCL 不是线程安全的,除非文档中另有说明,否则 RTL。
标签: multithreading delphi thread-safety tthread