不但没有意义,还可能因为自我等待而造成永远不可能终结的死锁。
procedure TForm1.FormCreate(Sender: TObject);
begin
MySection:=TCriticalSection.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MySection.Enter;
Caption:=Caption+' E ';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
MySection.Leave;
Caption:=Caption+' L.';
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MySection.Free;
end;
如上所示:Button1用来进入临界区,Button2用来退出。如果每次都按照先点1后点2的方
式使用,没有任何问题。但如果点了1之后再次点1,程序就会陷入自我死锁——等待被自己
占用的资源。
在多线程程序中,一个进程只会等待另一个进程所占用的资源,而每个进程一般都会在有
限的时间内使用完特定资源然后释放,这样就不会出现无限等待的死锁。而单线程一旦开始
等待被自己占用的资源,就不可能等到——因为能够释放资源的就是自己,而陷入等待的它
不可能“有空”去释放任何资源!