gpt4 book ai didi

multithreading - 从并发线程访问同一个对象

转载 作者:行者123 更新时间:2023-12-01 22:28:41 25 4
gpt4 key购买 nike

有两个对象实例,我应该从两个并发线程、VCL 线程和工作线程访问它们。

TSlave = class
...
public
...
statusByte: byte;
...
end;

TMaster = class
private
FSlaves: TList;
FrBuffer: array of byte;
...
public
CMD_GET_SLAVE( aSlave: TSlave );
...
end;

procedure TMaster.CMD_GET_SLAVE( aSlave: TSlave );
begin
...
rBuffer := udpsend(); //calling a function that sends udp packet and returns the answer
aSlave.statusByte := rBuffer[2];
...
end;

我将从属对象的引用存储在 VCL TTreeNodes - treenode.data 的“数据”字段中(我也将它们存储在 TMaster 私有(private)列表中)。

有两个“选项”用于访问从属对象(编写 slave.statusByte)和 TMaster 实例(当我通过 TMaster 实例访问从属对象时)>>
  • 单击树节点。当这种情况发生时,我发送一个调用master.CMD_GET_SLAVE的UDP数据包,在这个方法中我从FrBuffer读取答案并写入slave.statusByte。
  • 有一个工作线程循环执行相同的操作(调用 master.CMD_GET_SLAVE)。在这种情况下,我没有从 treenode.data 中获取从属实例,而是从主控的 TList 对象(FSlaves)中获取。

  • 问题是,如何正确管理?因为当用户单击树节点时,可能存在一种可能的情况,同时可能有来自线程的传入访问。

    我没有从工作线程触及任何 VCL 控件,“只是”从两个并发线程访问相同的对象。我是否应该在同步主 VCL 线程时执行与我相同的同步(因为刷新了一些可视化 VCL 控件)?

    最佳答案

    如果您有多个线程访问共享对象,并且至少有一个线程修改了该对象,那么您通常需要使用锁(例如 TCriticalSectionTMonitor )来序列化对共享对象的访问。这样做的一些选择:

  • 使用锁从外部保护对共享对象的所有访问。
  • 使用自己的私有(private)锁使对象自同步。那是内部同步选项。
  • 选项 2 对调用者来说更简单,但会强制类的所有消费者支付同步成本。另一种方法是使对象没有内部同步,然后围绕它包装一个同步类,以呈现线程安全版本。
  • 关于multithreading - 从并发线程访问同一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24062721/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com