我有一个TThreadList
包含所有指向我的服务器创建的对象的指针。服务器有一个线程池,用于向该线程列表中的所有客户端发送数据。它锁定列表,然后在用户断开连接后释放列表,删除对象和引用指针。
问题是:线程池不知道套接字何时断开连接并被删除,因此当池工作时,它将在已以某种方式已被删除的线程列表中选择的指针上进行 AV。
例如,池的Execute
方法:
try
with userlist.LockList do
begin
for i := Count - 1 downto 0 do
begin
if i >= 0 then
begin
p := TClient(items[i]);
//problem here p gets deleted so it raises items[i]
//have an invalid pointer to memory
if p <> nil then
if p.sockethex <> nil then
begin
sendtexthexpool(p.sockethex, msgprimit+ '|'); //here AV cause P was deleted
end;
end;
end;
end;
finally
userlist.UnlockList;
end;
end;