临界区的问题(50分)

L

lgh200

Unregistered / Unconfirmed
GUEST, unregistred user!
我在看delphi 对winsock.dll的封装,对于TCustomWinSocket类中的ReceiveBuf函数有一些疑问
这个函数里面没有用到全局变量什么的,它为什么要用临界区控制啊,请大侠们指教,谢谢!
function function TCustomWinSocket.ReceiveBuf(var Buf;
Count: Integer): Integer;
var
ErrorCode: Integer;
begin
Lock;
try
Result := 0;
if (Count = -1) and FConnected then
ioctlsocket(FSocket, FIONREAD, Longint(Result))
else
begin
if not FConnected then
Exit;
Result := recv(FSocket, Buf, Count, 0);
if Result = SOCKET_ERROR then
begin
ErrorCode := WSAGetLastError;
if ErrorCode <> WSAEWOULDBLOCK then
begin
Error(Self, eeReceive, ErrorCode);
Disconnect(FSocket);
if ErrorCode <> 0 then
raise ESocketError.CreateResFmt(@sWindowsSocketError,
[SysErrorMessage(ErrorCode), ErrorCode, 'recv']);
end;
end;
end;
finally
Unlock;
end;
end;
.
 
为了防止多线程访问冲突,可以用临界区是线多线程的同步。lock 和 unlock可以实现
多共享资源的访问。
 
我不知道在这个函数中它用临界区控制的是哪个资源?
 
控制的是FSocket,Windows Socket句柄,防止多线程同时对它操作
 
TO ss2000
那么如果我把TCustomWinSocket作为线程的局部变量,lock和Unlock加不加无所谓了,是不
是这样?
还有一个问题,为什么我定义了一个TList对象作为一个线程的的局部变量,操作时它还是
会出错。
 
如果TCustomWinSocket只是线程的局部变量,也就是说是单线程使用,确实加不加
都可以,不过,那样就不是线程安全的了,再说,那是的Delphi的控件,你就不用
操心是否加不加了。
>>还有一个问题,为什么我定义了一个TList对象作为一个线程的的局部变量,操作
>>时它还是会出错。
出什么错?
 
谢谢你的解答。我知道什么地方出错了。
 
顶部