不创建线程也可以使用临界区吗?(20分)

  • 主题发起人 主题发起人 asiancat
  • 开始时间 开始时间
A

asiancat

Unregistered / Unconfirmed
GUEST, unregistred user!
我看一个程序就没有创建TThread,但是程序在向一个可视的控件里面写信息的时候用到了临界区.
我想问下,这个做法可以吗?不创建线程也可以使用临界区吗?
 
临界区可以随意使用,
只是你的代码若没有被并发访问,临界区没有什么意义而已.
 
如果没有多线程用临界区一点意义都没有。单线程访问 又不需要加锁
 
不但没有意义,还可能因为自我等待而造成永远不可能终结的死锁。
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,程序就会陷入自我死锁——等待被自己
占用的资源。
在多线程程序中,一个进程只会等待另一个进程所占用的资源,而每个进程一般都会在有
限的时间内使用完特定资源然后释放,这样就不会出现无限等待的死锁。而单线程一旦开始
等待被自己占用的资源,就不可能等到——因为能够释放资源的就是自己,而陷入等待的它
不可能“有空”去释放任何资源!
 
单线程不建议使用
 
类似红绿灯,单线程就像在一条单行线马路上,设置红绿灯毫无意义。
 
接受答案了.
 
后退
顶部