我正在通过 Indy 套接字处理流数据包字符串,在客户端,我有一个线程TIdTCPClient
从 我有另一个线程从一开始就不断地读取这个缓冲区,根据需要复制(和删除)数据(一次一个完整的数据包)。
我知道在任何情况下,访问同一个变量的两个线程都是危险的。但这也适用于字符串吗?还是只是对象?从两个不同的线程读取/写入相同的字符串,我能感到安全吗?如果不是,那我应该怎么做来保护这个字符串?这是一个简单的字符串,称为FBuffer
.
我将数据附加到末尾,如下所示:
procedure TListenThread.CheckForData;
begin
if FClientSocket.Connected then begin
FClientSocket.IOHandler.CheckForDataOnSource(5000);
if not FClientSocket.IOHandler.InputBufferIsEmpty then
FBuffer:= FBuffer + FClientSocket.IOHandler.InputBufferAsString;
end;
end;
另一个线程是这样读的:
procedeure TPacketThread.CheckForPacket;
var
P: Integer; //Deliminator position
T: String; //Temp copying string
Z: Integer; //Expected packet size
begin
P:= Pos('#', FBuffer);
if P > 0 then begin //Is the deliminator found?
T:= Copy(FBuffer, 1, P-1); //Copy up to deliminator...
Z:= StrToIntDef(T, 0); //Convert packet size to integer...
if Z > 0 then begin
//Is there a full packet waiting in buffer?
if Length(FBuffer) >= Z then begin
//First, delete size definition and deliminator...
Delete(FBuffer, 1, P);
//Now grab the rest of it up to the packet size...
T:= Copy(FBuffer, 1, Z);
//Delete what we just copied...
Delete(FBuffer, 1, Z);
//Finally, pass this packet string for further processing...
ProcessPacket(T);
end;
end;
end;
end;
该代码是我的代码的简化版本,只是为了演示我需要做的所有工作FBuffer
。