2011-04-29 80 views
2

当第二个线程执行时,它会导致异常。你能解释为什么吗?访问线程本地存储

class TLS 
{ 
    public void Run() 
    { 
     lock (this) 
     { 
      Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " started."); 
      LocalDataStoreSlot ldss = Thread.AllocateNamedDataSlot("unique"); // Exception 
      Thread.SetData(ldss, "some_data"); 
      string a = Thread.GetData(ldss) as string; 
      Thread.Sleep(1000); 
      Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " ended."); 
     } 
    } 
} 

异常详细信息:

at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add) at System.LocalDataStoreMgr.AllocateNamedDataSlot(String name) at ConsoleApplication2.TLS.Run() in AutoLock.cs:line 65 at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()

感谢。

回答

3

您正试图分配两次具有相同名称的插槽。您可能需要阅读MSDN documentation

更新:在启动线程之前,您应该只分配一次插槽。在你的主程序中做。现在你每当一个线程开始时都会这样做,这就是为什么你会得到这个异常。

+0

如果它是TLS,它不应该是每个线程唯一的。为什么每个线程都使用相同的插槽? – Azodious 2011-04-29 08:20:38

+0

@Azodius:因为你做了两次。只需调用一次 - 具有该名称的插槽将分配给每个线程。只需阅读链接的MSDN文档,就可以解释它。 – ChrisWue 2011-04-29 08:39:36

+0

好的。这意味着当插槽创建时,它会在每个线程的TLS中创建。 – Azodious 2011-04-29 09:00:53

0

它记录在here。基本上你错用了它。如果指定与 插槽

如果使用的AllocateNamedDataSlot方法 ,应该在程序启动时的主 线程调用,因为它 抛出异常:你不能分配一个名为插槽两次名字已经被分配了 。没有办法测试 是否已经分配了一个插槽 。

相关问题