【问题标题】:ManagedThreadID is not unique?ManagedThreadID 不是唯一的?
【发布时间】:2011-12-21 21:32:38
【问题描述】:

我的程序为某些任务创建了一些线程。

我的代码是这样的:

Dictionary<int, double> threadStates = new Dictionary<int, double>();
for (int i = 0; i < SubNNs.Count(); i++)
{
    Thread tt = new Thread(StartTrainingSubs);
    threadStates.Add(tt.ManagedThreadId, 0);
    tt.Priority = ThreadPriority.Highest;
    tt.Start(i);
}

但有时,如果SubNNs.Count() 变大(10-20),程序会抛出此异常:“已添加具有相同键的项目。”在线threadStates.Add(tt.ManagedThreadId, 0);

为什么我给出这个错误? ManagedThreadId 不是唯一的吗? 如果是,我该怎么办?

如果不是,也许一个线程结束而另一个线程以相同的ManagedThreadId 开始?可能吗?如何预防这个问题?

还是有别的问题?

编辑:用户说 ManagedThreadId 可以重复使用。那么,由于在后面的代码中,每个线程都需要用一个唯一的编号来认识自己,有没有办法给线程添加一个名称之类的东西,让每个线程都可以得到它的唯一编号?

感谢您的建议!

【问题讨论】:

  • 是的,线程 ID 被回收。

标签: c# multithreading dictionary


【解决方案1】:

如果不是,也许一个线程结束而另一个线程以相同的 ManagedThreadId 开始?可能吗?如何预防这个问题?

是的。托管线程 ID 可以重复使用。它们不是字典状态键的好选择。

您应该考虑使用其他唯一值,而不是使用线程 ID 来跟踪状态。在您的情况下,“i”在每个循环中都是唯一的 - 为什么不将它用作您的密钥?

【讨论】:

  • 谢谢。 “i”是独一无二的,没错。但在另一部分代码中,每个线程都需要知道自己,每个线程都知道自己的 ManagedThreadId,但不知道“i”。
  • 我可以给每个线程设置一个名字吗?那么,每个线程都可以识别自己吗?
  • @Mahdi 你需要线程 ID 做什么?您可以将信息传递给线程的开头 - 您现在正在这样做 (tt.Start(i);) 只需传递您需要的状态。如果您需要一个唯一标识符,请在前面将一个标识符传递给 ParameterizedThreadStart 例程。
  • 每个线程调用一个类中的另一个函数,每个类的事件都应该有一个唯一的编号来标识自己。所以,似乎我应该在该类中添加一个 ID 变量并用“i”填充它。因此,每个线程都可以识别自己。对吗?
  • 我之前在哈希表中使用过 ManagedThreadId 作为键查找。但是,在调用 .Add() 之前,请确保调用 .Exists(),并在条目已存在时重用它。这样您就不会尝试添加已重用的线程 ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多