Multithreading 使用Delphi掌握多线程需要哪些核心原则?

Multithreading 使用Delphi掌握多线程需要哪些核心原则?,multithreading,delphi,Multithreading,Delphi,一般来说,我对编程有点陌生(大约8个月左右,Delphi时断时续,到处都有一点Python),我正在买一些书 我对学习并发编程和使用Delphi构建多线程应用程序感兴趣。每当我搜索“多线程Delphi”或“Delphi多线程教程”时,我似乎会得到相互矛盾的结果,因为有些内容是关于使用某些库(Omnithread库),而其他内容似乎更适合经验丰富的程序员 我读过不少关于德尔菲的书,大部分书似乎都是浅尝辄止,没有深入探讨这个问题。我有一个朋友是程序员(他使用c++),他建议我在使用线程时了解底层系统

一般来说,我对编程有点陌生(大约8个月左右,Delphi时断时续,到处都有一点Python),我正在买一些书

我对学习并发编程和使用Delphi构建多线程应用程序感兴趣。每当我搜索“多线程Delphi”或“Delphi多线程教程”时,我似乎会得到相互矛盾的结果,因为有些内容是关于使用某些库(Omnithread库),而其他内容似乎更适合经验丰富的程序员

我读过不少关于德尔菲的书,大部分书似乎都是浅尝辄止,没有深入探讨这个问题。我有一个朋友是程序员(他使用c++),他建议我在使用线程时了解底层系统的实际情况,而不是先跳到如何在程序中实际实现它们

在Amazon.com上有很多关于并发编程的书,但没有一本是用Delphi编写的


基本上,如果我可以/应该尝试使用并非专门针对Delphi开发人员的书籍来学习线程,那么在开始使用线程之前,我需要知道我应该重点学习的主要内容是什么(我现在不想把阅读书籍与其他语言的大量代码示例混为一谈)如果这里有任何人可以推荐的关于这个主题的可靠资源/书籍

我认为实际尝试编译一个关于多线程应该知道的事情的列表可能会有用

  • 同步原语:,监视器
  • 同步原语的Delphi实现:
    TCriticalSection
    tRewSync
    TEvent
  • 原子操作:关于哪些操作是原子操作,哪些操作不是原子操作的一些知识(已讨论)
  • Windows API多线程功能:
    联锁增量
    联锁交换

当然,这还远远没有完成。我创建了这个社区wiki,这样每个人都可以编辑。

简短回答
去安装它并阅读网站上的所有内容

更长的答案
您要求提供一些信息,所以这里是:
以下是一些需要阅读的内容:


我个人喜欢:
(虽然很旧,但基本原理仍然适用)

基本原则:
您的基本VCL应用程序是单线程的。
VCL的构建并没有考虑多线程,而是采用螺栓连接螺纹支撑,因此大多数VCL组件都不是线程安全的。
这样做的方式是让CPU等待,因此如果您想要一个快速的应用程序,请注意何时以及如何与VCL通信

与VCL通信
您的基本线程是具有自己成员的TThread的从属线程。
这些是每线程变量。只要您使用这些,就不会有任何问题。
我最喜欢的与主窗口通信的方式是使用自定义windows消息和
postmessage
异步通信。
如果你想同步交流,你需要使用关键部分
同步
方法。
例如,请参阅本文:

线程间通信
这就是事情变得棘手的地方,因为您可能会遇到各种难以调试的同步问题。
我的建议:使用,也可以看到这个问题:
有些人会告诉你,在x86上读取和写入整数是原子的,但这并不是100%正确的,所以不要天真地使用它们,因为你很可能会犯一些微妙的错误,最终导致难以调试的代码

启动和停止线程
在旧的Delphi版本中,使用了
Thread.suspend
Thread.resume
,但是这些不再推荐,应该避免(在线程同步的上下文中)。
请参见此问题:
也可以看看这个问题,尽管答案比较模糊:
可以使用
suspend
resume
暂停和重新启动线程,但不要将它们用于线程同步

性能问题
wait_for…
synchonize
etc代码放入线程中会有效地停止线程,直到等待的操作发生。
在我看来,这违背了线程的一个重要目的:速度
所以,如果你想跑得快,你就必须要有创造力

很久以前,我编写了一个名为Life32的应用程序。
这是康威生活游戏的显示程序。可以非常快地生成模式(在小模式上每秒生成数百万代)。
它使用单独的线程进行计算,并使用单独的线程进行显示。
显示是一种非常缓慢的操作,不需要每一代都进行显示。
生成线程包含显示代码,从显示中删除内容(在视图中),显示线程仅设置一个布尔值,告诉生成线程也显示添加的内容。
生成代码使用DirectX直接写入视频内存,不需要VCL或Windows调用,也不需要任何类型的同步。
如果移动主窗口,应用程序将继续显示在旧位置,直到暂停生成,从而停止生成线程,此时更新线程变量是安全的。
如果线程没有100%同步,那么显示时间就太晚了,没什么大不了的。
它还具有一个自定义内存管理器,可以避免标准内存管理器中的线程安全缓慢。 避免