gpt4 book ai didi

multithreading - 命名线程的最佳实践

转载 作者:行者123 更新时间:2023-12-03 15:23:28 24 4
gpt4 key购买 nike

最近我开发了一个高并发事件驱动框架(Java Akka),它将创建大量的 Actor 线程。当我调试 Akka 应用程序时,线程有非常有意义的名称。真是太棒了。当我切换回 Delphi 时,我对所有线程都未命名感到不安,尽管它们已经在过去 20 年里没有命名了。

对于我自己设计的所有线程类,我遵循这样的模式:定义一个 setter SetThreadName 并在 Execute 中调用 NameThreadForDebugging方法。到目前为止效果很好。

type
TMyThread = class(TThread)
private
FThreadName: string;
protected
procedure Execute; override;
public
procedure SetThreadName(const ThreadName: string);
end;

procedure TMyThread.SetThreadName(const ThreadName: string);
begin
FThreadName := ThreadName;
end;

procedure TMyThread.Execute;
begin
NameThreadForDebugging(FThreadName);
// Put normal thread execution code here
end;

但是第三方线程的那些实例将保持未命名,除非我创建一个后代线程类。是否有 Delphi MagicSetThreadName 设置为 Thread 基类?我可以使用 Detour.pas 强制在 Execute 方法的第一个位置调用 NameThreadForDebugging(FThreadName) 。

有什么想法吗?

<小时/>

更新 1 感谢 David 的善意帮助。为了帮助其他读者更好地理解我的问题,该问题已被重新表述。

  1. 我的代码出了什么问题?

    NameThreadForDebugging 方法实际上是一个静态方法。第二个参数ThreadId是可选的,默认等于当前线程id。如果我没有明确给出ThreadId,我很可能会命名当前线程,而不是我真正想要命名的线程。

  2. 解决方案是什么?

    在任意位置调用 MyThread.NameThreadForDebugging('a_name', MyThread.ThreadId); 或在 TMyThread 开头调用 NameThreadForDebugging('a_name');。执行

  3. 为什么这么困惑,无法把事情做好?

    我不明白,为什么不提供没有第二个ThreadId的非静态版本。如果有这样一个非静态版本,我就不会犯这个错误了。

最佳答案

我在这里即兴发挥,但在我看来,您似乎认为只能通过在该线程内执行的代码来命名该线程。但事实并非如此。为了命名一个线程,您只需要它的 ID。

documentation给出函数签名如下:

class procedure NameThreadForDebugging(AThreadName: AnsiString; 
AThreadID: TThreadID = TThreadID(-1)); static;

如果您不提供可选的线程 ID 参数,则传递 -1,它被解释为“执行线程”。到目前为止,这就是您使用 NameThreadForDebugging 的方式。但是,您可以只传递线程 ID。由于您显然拥有线程实例,因此您也拥有它们的 ID。

您想象的接口(interface)涉及调用传递线程名称的线程实例方法。这就是您想象的编写这段代码:

Thread.SetThreadName(ThreadName);

您可以简单地编写:

TThread.NameThreadForDebugging(ThreadName, Thread.ThreadID);

如果你想使用类助手,你可以这样做:

type
TThreadHelper = class helper for TThread
public
procedure SetThreadName(const ThreadName: string);
end;

procedure TThreadHelper.SetThreadName(const ThreadName: string);
begin
TThread.NameThreadForDebugging(ThreadName, ThreadID);
end;

坦白说,我不认为我会遇到这样的麻烦。调用 NameThreadForDebugging 似乎完全足够了。

关于multithreading - 命名线程的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23343765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com