T
talent002
Unregistered / Unconfirmed
GUEST, unregistred user!
线程问题:关于indy的demo/chat的问题。demo中用Tlist来存放客户端的信息。求在多线程中,能正常、安全删除tlist中指定节点的方法。 (51分)<br />idtcpserver不管用什么方法,要把tlist保护起来,然后删除指定的节点。(就是,在一个线程要对tlist进行删除操作时,其它tlist不能进行删除操作。要等它删除完了才可以让其它线程做删除操作)。
问题:
怎么找出指定的节点?
用
for i:=0 to tlist.count-1 do
begin
if tlist.items...='...' then
begin
tlist.delete(i);
exit;
end;
end;
这样的方法来找吗?这样的话,如果在找的过程中(找到一半,但还没做删除操作),其它线程对tlist做了删除,或增加,那么tlist.count就会变化。同时也有可能导致tlist.items得不到我想要的那个item。不知怎么避够这个样的错误产生?或是有没其它更好的方法来找到指定的节点?
比如两个线程都在对tlist进行删除操作。
(1)“<0>”表示要删除的节点。“=”表示其它节点。刚开始时
A线程:===================<O>“tlist.count是20”
B线程:===========<O>========
|
时间T
(2)B线程在时间T的位置删除了tlist的一个节点。那么tlist.count就变成了19.很明显线程A再用for i:=0 to tlist.count(这里是还是20) do会出错。
请问怎么解决?
问题:
怎么找出指定的节点?
用
for i:=0 to tlist.count-1 do
begin
if tlist.items...='...' then
begin
tlist.delete(i);
exit;
end;
end;
这样的方法来找吗?这样的话,如果在找的过程中(找到一半,但还没做删除操作),其它线程对tlist做了删除,或增加,那么tlist.count就会变化。同时也有可能导致tlist.items得不到我想要的那个item。不知怎么避够这个样的错误产生?或是有没其它更好的方法来找到指定的节点?
比如两个线程都在对tlist进行删除操作。
(1)“<0>”表示要删除的节点。“=”表示其它节点。刚开始时
A线程:===================<O>“tlist.count是20”
B线程:===========<O>========
|
时间T
(2)B线程在时间T的位置删除了tlist的一个节点。那么tlist.count就变成了19.很明显线程A再用for i:=0 to tlist.count(这里是还是20) do会出错。
请问怎么解决?