multithreading - Delphi 线程 - 代码的哪些部分需要保护/同步?

标签 multithreading delphi

到目前为止,我认为无论如何,对“共享”对象(多线程常见)进行的任何操作都必须受到“同步”保护。显然,我错了 - 在我最近研究的代码中,有很多类(正如作者声称的那样,是线程安全的),并且只有其中一个类对几乎每种方法都使用了关键部分。

如何找到代码的哪些部分/方法需要使用 CriticalSection(或任何其他方法)进行保护,哪些不需要?

到目前为止,我还没有偶然发现任何有趣的解释/文章/博客笔记,所有谷歌结果是:

a) 线程和 GUI 之间的同步示例。从简单的进度条到最复杂的进度条,但教训仍然很明显:每次访问/修改 GUI 组件的属性时,请在“同步”中执行此操作。但仅此而已。

b) 解释关键部分、互斥体等的文章。只是不同的保护/同步方法。

c) 非常非常简单的线程安全类(线程安全堆栈或列表)的示例 - 它们都执行相同的操作 - 实现锁定/解锁方法,这些方法会进入/离开临界区并在锁定时返回实际的堆栈/列表指针.

现在我正在寻找解释代码的哪些部分应该受到保护

可以以代码的形式;)但请不要再给我提供一个“使用同步更新进度条”...;)

谢谢!

最佳答案

您正在询问一个非常普遍的问题的具体答案。

基本上,除了 UI 操作之外,您还应该保护每个共享内存/资源访问,以避免两个潜在的竞争线程:

  • 读取不一致的内存
  • 同时写入内存
  • 尝试从多个线程同时使用同一资源...直到该资源是线程安全的。

通常,我认为任何其他操作都是线程安全的,包括访问非共享内存或非共享对象的操作。

例如,考虑这个对象:

type
  TThrdExample = class
  private
    FValue: Integer;
  public
    procedure Inc;
    procedure Dec;
    function Value: Integer;
    procedure ThreadInc;
    procedure ThreadDec;
    function ThreadValue: Integer;
  end;

ThreadVar
  ThreadValue: Integer;

Inc、Dec 和 Value 是对 FValue 字段进行操作的方法。这些方法不是线程安全的,除非您使用某种同步机制保护它们。对于 Value 函数,它可以是 MultipleReaderExclusiveWriterSinchronizer;对于 Inc 和 Dec 方法,它可以是 CriticalSection。

ThreadInc和ThreadDec方法对ThreadValue变量进行操作,该变量被定义为ThreadVar,所以我认为它是ThreadSafe的,因为它们访问的内存不在线程之间共享......来自不同线程的每个调用将访问不同的内存地址。

如果您知道按照设计,一个类应该仅在一个线程中或在其他同步机制中使用,那么您就可以自由地考虑线程安全的设计

如果您想要更具体的答案,我建议您尝试提出更具体的问题。

致以诚挚的问候。

编辑:也许有人说整数字段是一个坏例子,因为你可以认为整数操作在 Intel/Windows 上是原子的,因此不需要保护它......但我希望你明白这个想法.

关于multithreading - Delphi 线程 - 代码的哪些部分需要保护/同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3868403/

相关文章:

java - 如何根据用户的请求暂停和恢复多个 Java 线程?

java - 使用生产者-消费者模式的多代理系统?

Delphi 编辑器配色方案

用于显示数学表达式的 Delphi 组件或库

ios - Delphi XE4 iOS 打开电子邮件程序不工作

delphi - Firemonkey 应用程序的单元测试

c++ - 如何正确使用 std::condition_variable?

android - 如何从主 UI 线程检测到 Parse 的 query.findInBackground 已完成并返回数据?

c++ - 0 作为 std::condition_variable::wait_for 中的超时

Delphi 使用可变参数列表调用 JNI 方法