【问题标题】:Delphi: How to lock "Socket.Write" and unlock?Delphi:如何锁定“Socket.Write”并解锁?
【发布时间】:2012-01-16 09:33:29
【问题描述】:

我有几个客户端,它们写入一个套接字(不是端口),当它们一起写入时,我收到垃圾,来自所有客户端的所有数据都被合并。

所有客户端都在 Threads 中的同一个程序中。

我需要锁定 write()

ASocket.Connection.Socket.LOCK; // need to be thread safe
ASocket.Connection.Socket.Write(buf);
ASocket.Connection.Socket.UNLOCK; // need to be thread safe

我该怎么做?

谢谢。

德尔福 2010、印地 10、Win7

【问题讨论】:

    标签: multithreading delphi indy


    【解决方案1】:

    你可以使用TCriticalSectionSyncObjs单位):把Write放在EnterLeave之间:

    CriticalSection.Enter;
    try
      ASocket.Connection.Socket.Write(buf);
    finally
      CriticalSection.Leave;
    end;
    

    AcquireRelease 方法的作用相同 (doc)。重要提示:如果您在代码的多个点写入套接字,则必须使用相同的对象(我在上面的示例中称为CriticalSection)。

    【讨论】:

    • CriticalSection 变量必须是全局变量?我需要 .Create();第一次在某个地方?
    • 当然。您必须将CriticalSection 声明为TCriticalSection,并使用CriticalSection := TCriticalSection.Create; 创建它并在使用完套接字后使用CriticalSection.Free; 释放它,并且不再需要锁定。
    • 我会让 CS 成为您用于 ASocket 的任何类的成员,这样您就可以拥有每个连接锁,例如:ASocket.Lock.Enter; ...。但是,是的,您确实需要 Create()Free() CS。
    • 其实不必是全局的,也可以是类的成员。这取决于代码的整体结构。如果它是一个简单的控制台应用程序,那么可以,您可以在全局 var 部分声明它。
    • CS 应该在创建可写套接字时创建 - 将其存储在使用的任何套接字上下文中。你也许可以重写 write() 来获取/释放它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2019-07-29
    • 2012-04-30
    • 2018-05-26
    • 2016-05-28
    • 2015-05-14
    • 1970-01-01
    相关资源
    最近更新 更多