Snu*_*rik 4 winapi multithreading freepascal critical-section
为什么没有睡眠(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;
Run Code Online (Sandbox Code Playgroud)
由于代码太多而无法发布此文本文本文本文本文本.哦,顺便说一下,如果该部分是由线程创建的,那么它工作正常.
有没有保证线程获取基于FIFO(MSDN)上的一个关键部分.如果您的当前线程在释放它之后总是重新获取关键部分几个uops,那么任何其他等待线程很可能永远不会及时唤醒以找到它自己可用.
如果您想更好地控制锁定顺序,可以使用其他同步对象.事件或队列可能是合适的,但我们并不真正知道您要实现的目标.
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |