Multithreading 是TThread.Synchronize邪恶/死胎吗?

Multithreading 是TThread.Synchronize邪恶/死胎吗?,multithreading,delphi,synchronization,Multithreading,Delphi,Synchronization,我得到的印象是,一个至少应该从主线程控制一点的线程根本不能使用Synchronize():任何这样做的尝试几乎都会立即导致死锁 因此,也应该避免onTerminate事件,因为它是使用Synchronize调用的 例如,我有一个线程来做一些艰苦的背景工作。我想在状态栏中观察它的进度,如果用户按下关闭按钮,我就可以“优雅地”停止它 我不能使用FreeOnTerminate:=true,因为当线程启动时,我不能调用它的任何方法:在任何时候它都可能被破坏,我会得到访问冲突(或者完全破坏某些东西) 所以

我得到的印象是,一个至少应该从主线程控制一点的线程根本不能使用
Synchronize()
:任何这样做的尝试几乎都会立即导致死锁

因此,也应该避免onTerminate事件,因为它是使用Synchronize调用的

例如,我有一个线程来做一些艰苦的背景工作。我想在状态栏中观察它的进度,如果用户按下关闭按钮,我就可以“优雅地”停止它

我不能使用
FreeOnTerminate:=true
,因为当线程启动时,我不能调用它的任何方法:在任何时候它都可能被破坏,我会得到访问冲突(或者完全破坏某些东西)

所以,线程破坏是主线程的责任。在某种DoTerminate过程中完成所有“完成”工作并将onTerminate事件指向它是合乎逻辑的。但这就是死锁:我们无法从DoTerminate中释放线程,因为在TThread.free中有WaitFor,它无法在同步的onTerminate事件完成之前完成

不仅仅是OnTerminate:如果工作线程中有任何同步调用(例如,它想通知我们某些百分比的工作已完成等),那么如果此时主线程将使用工作线程执行smth,则可能会出现死锁:它们相互阻塞

所以,在我的理解中,使用Synchronize的唯一方法是将所有调用委托给工作线程端!例如,我们使用
FreeOnTerminate:=true创建它,它有时使用Synchronize()告诉我们它的进度,或者它已经完成并将被销毁。只有在这些程序中,我们才能控制它,但它使得“随意”关闭几乎不可能,或者过于复杂


我是否遗漏了一些东西(一些内部工作以某种方式帮助克服这些僵局)?因为我有点惊讶:Synchronize()是Delphi多线程手册中描述的第一批方法之一。它真的这么没用吗?

对于
同步
,有一些非常有效的用例,但是您必须小心地确定这些用例是什么,并确保您在编写代码时明确避免出现死锁情况的可能性。这是完全可能的,但需要仔细设计

通常,仅当需要工作线程等待主线程完成工作后再继续工作时,才应使用
Synchronize
。在大多数情况下,这是不必要的,通常最好使用
TThread.Queue
。使用
Queue
将工作发布到主线程,然后立即返回,而不等待主线程处理工作。这避免了使用
同步
时出现的大多数死锁陷阱


使用
队列
的唯一危险是主线程过载。如果您的工作线程将工作发布到主线程的速度快于主线程所能跟上的速度,那么您的主线程将无法处理排队的工作。

您可以发布代码吗?我在这里试过,效果很好。为什么这个问题被否决了?没有示例代码,我完全理解这一点。
同步
本身不是问题。程序架构是。例如,在保存关键部分时调用Synchronize(这可以……但更可能导致灾难)。同步的问题在于如何使线程彼此通信。