无法进入临界区
Unable to enter critical section
为什么没有Sleep(1)就无法进入临界区?
type
TMyThread = class(TThread)
public
procedure Execute; override;
end;
var
T: TMyThread;
c: TRTLCriticalSection;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
InitializeCriticalSection(c);
T := TMyThread.Create(false);
end;
procedure TMyThread.Execute;
begin
repeat
EnterCriticalSection(c);
Sleep(100);
LeaveCriticalSection(c);
sleep(1); // can't enter from another thread without it
until false;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
EnterCriticalSection(c);
Caption := 'entered';
LeaveCriticalSection(c);
end;
不能post 因为代码太多所以文本文本文本文本文本。
哦,顺便说一下,如果该部分是由线程创建的,那么它工作正常。
有no guarantee that threads acquire a critical section on a FIFO basis (MSDN)个。如果您当前的线程总是在释放临界区后几个 uops 重新获取临界区,那么很可能任何其他等待的线程可能永远不会及时醒来发现它自己可用。
如果您想更好地控制锁定顺序,可以使用其他同步对象。事件或队列可能是合适的,但我们真的不知道您想要实现什么。
为什么没有Sleep(1)就无法进入临界区?
type
TMyThread = class(TThread)
public
procedure Execute; override;
end;
var
T: TMyThread;
c: TRTLCriticalSection;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
InitializeCriticalSection(c);
T := TMyThread.Create(false);
end;
procedure TMyThread.Execute;
begin
repeat
EnterCriticalSection(c);
Sleep(100);
LeaveCriticalSection(c);
sleep(1); // can't enter from another thread without it
until false;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
EnterCriticalSection(c);
Caption := 'entered';
LeaveCriticalSection(c);
end;
不能post 因为代码太多所以文本文本文本文本文本。 哦,顺便说一下,如果该部分是由线程创建的,那么它工作正常。
有no guarantee that threads acquire a critical section on a FIFO basis (MSDN)个。如果您当前的线程总是在释放临界区后几个 uops 重新获取临界区,那么很可能任何其他等待的线程可能永远不会及时醒来发现它自己可用。
如果您想更好地控制锁定顺序,可以使用其他同步对象。事件或队列可能是合适的,但我们真的不知道您想要实现什么。