线程的命名规范是什么?

47

命名线程有助于诊断和调试,以便区分执行不同任务的线程。

在高度多线程应用程序中,是否有比其他方式更好的线程命名约定?有哪些指导方针?线程名称应该包含哪些信息?在为线程命名时,你学到了什么有助于他人的经验?

7个回答

44
据我所知,没有标准。随着时间的推移,我发现以下几点指南很有帮助:
  • 使用短名称,因为它们不会使日志文件中的行太长。

  • 创建名称时,重要部分位于开头。图形用户界面中的日志查看器通常具有带有列的表格,线程列通常很小,或者您可以将其调整为使其他所有内容都能读取。

  • 不要在线程名称中使用“thread”这个词,因为这是显而易见的。

  • 使线程名称易于grep。避免类似的线程名称

  • 如果您有多个相同性质的线程,请使用在应用程序的一个执行或一个日志文件中唯一的ID进行枚举,具体取决于您的日志记录习惯。

  • 避免使用泛化的名称,例如“WorkerThread”(如何命名下一个5个工作线程?),“GUIThread”(哪个GUI?是针对一个窗口还是全部?)或“Calculation”(它计算什么?)。

  • 如果您有一个测试组,他们使用线程名称来grep应用程序的日志文件,请勿在一段时间后重命名线程。这样做会让您的测试人员非常不满意。在经过充分测试的应用程序中,线程名称应该是固定的。

  • 当您有服务于网络连接的线程时,请尝试在线程名称中包含目标网络地址(例如channel_123.212.123.3)。但是,如果有多个连接到同一主机,则不要忘记进行枚举。

如果您有很多线程并且忘记为其中一个命名,则您的日志机制应输出一个唯一的线程ID(特定于API,例如通过调用pthread_self())。


2

给线程命名是有用的,你应该遵循命名规则,不论是变量、方法还是类。按照其所作的事情来命名,并简洁明了。如果你遇到需要线程转储的问题,查看名称会很好,从而知道在代码中查找问题的位置,而不是检查堆栈跟踪并猜测。

唯一的区别在于,如果有多个相同类型的线程,您真的应该添加某种索引作为线程名称,以满足特定API的要求。如果显示线程名称,还可以帮助日志记录,以了解应用程序如何使用在不同线程上进行部分执行。


2

尽管Thorsten的回答是最全面的,但你可能想看一下Tomcat如何命名其线程。我发现这很有用。我们正在使用quartz调度程序运行多个线程,并且Thorsten建议的许多命名规则都非常有用。

您将使用线程池吗?如果是,则将降低添加更多有用元信息的机会。如果没有,那么您可以拥有多少有用的信息就没有界限了。


1

这样怎么样:

[命名空间].[类][.类...].[方法][当前线程]?

所以你有这些名称:

Biz.Caching.ExpireDeadItems1
Biz.Caching.ExpireDeadItems2
Biz.Caching.ExpireDeadItems3

对于每个线程等等。


0

我看到了.NET中几种线程命名约定。

有些人喜欢在名称开头使用“t”(例如tMain Thread),但我认为它没有任何实际价值。 相反,为什么不使用简单明了的描述性名称(如变量)例如HouseKeepingScheduler等。


0
我想贡献一个我开始使用的模式,使我的线程名称有意义。在我看来,线程就像是执行任务的工人。因此,我喜欢看待线程要执行的任务,并给线程起一个能够标识它作为该任务执行者的名称。
例如,一个任务是拖地的人可能被称为清洁工。在这种情况下,Mop(floor) 就是我的任务,而 清洁工 就是我的线程。 在C#中,我的代码可能会类似于:
Thread janitor = new Thread(() => Mop(floor));
janitor.Start();

或者,如果我有一个我想要监视传入数据的流,那么任务就是监视流。负责执行该任务的线程将被称为流监视器。
_streamMonitor = new Thread(() => Monitor(stream));
_streamMonitor.Start();

-1

我倾向于以与命名方法或变量相同的方式来命名线程。选择一个简洁地描述线程负责的过程的名称。我认为在线程名称中没有太多额外的信息可以或应该添加。表达力强但简洁是主要目标。

唯一的约定可能是为池中的线程添加递增的后缀。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接