multithreading - 无法进入临界区

标签 multithreading winapi freepascal 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; 

由于代码太多,无法发布此内容,因此文本文本文本文本文本。
哦,顺便说一句,如果该部分是由线程创建的,那么它工作正常。

最佳答案

no guarantee that threads acquire a critical section on a FIFO basis (MSDN) .如果您当前的线程总是在释放临界区后重新获取几个 uop,那么任何其他等待线程可能永远不会及时唤醒以发现它自己可用。

如果您想更好地控制锁序列,您可以使用其他同步对象。事件或队列可能是合适的,但我们真的不知道你想要实现什么。

关于multithreading - 无法进入临界区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47550377/

相关文章:

c - 没有 "Windows Security Alert"的网络程序

delphi - Lazarus 中的内存泄漏,如何使用 Heaptrcon 调试它们?

installation - 将字符串转换为字节数组将不起作用

java - 单例类的公共(public)方法应该同步吗?

multithreading - 如何利用 Clojure 中的所有 CPU 内核

c++ - 如何在 Visual Studio C++ Win32 项目中填充组合框

drag-and-drop - 处理 WM_DROPFILES 消息在 Lazarus 中不起作用

multithreading - BlackBerry-取消在另一个类中执行的线程以刷新位置

c++ - 使用原子指令实现 C++ 锁?

c++ - 如何取消 CallWndProc 钩子(Hook)中的消息