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

mig*_*jek 6 delphi multithreading

到目前为止,我认为对"共享"对象(多个线程通用)所做的任何操作都必须用"同步"保护,无论如何.显然,我错了 - 在我最近研究的代码中有很多类(线程安全的,如作者声称的那样),并且其中只有一个使用Critical Section来处理几乎所有方法.

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

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

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

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

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

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

可能是代码的形式;)但请不要再向我提供"使用Synchronize更新进度条"...;)

谢谢!

jac*_*ate 5

您要求对一般问题的具体答案.

基本上,除了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;
Run Code Online (Sandbox Code Playgroud)

Inc,Dec和Value是在FValue字段上运行的方法.在使用某种同步机制保护方法之前,这些方法不是线程安全的.它可以是Value函数的MultipleReaderExclusiveWriterSinchronizer和Inc和Dec方法的CriticalSection.

ThreadInc和ThreadDec方法在ThreadValue变量上运行,它被定义为ThreadVar,所以我认为它是ThreadSafe,因为它们访问的内存不是在线程之间共享的......来自不同线程的每次调用都会访问不同的内存地址.

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

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

最好的祝福.

编辑:也许有人说整数字段是一个坏的例子,因为你可以考虑整数运算原子在英特尔/ Windows上因此不需要保护它...但我希望你明白这一点.