2011-04-29 5 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

+0

@Azodius : 당신이 그것을 두 번하고 있기 때문에. 한 번만 호출하면 해당 이름의 슬롯이 각 스레드에 할당됩니다. 연결된 MSDN 설명서를 읽으십시오. – ChrisWue

+0

확인. 즉, 슬롯이 만들어지면 모든 스레드의 TLS에서 만들어집니다. – Azodious

0

here에 대해 설명되어 있습니다. 기본적으로 잘못된 방식으로 사용하고 있습니다. 당신은 두 번 명명 된 슬롯을 할당 할 수 없습니다 :

을 AllocateNamedDataSlot 방법을 사용하는 경우,이 프로그램 시작시 주요 스레드에서 호출해야합니다, 그것은 이 예외가 발생하기 때문에 있는 슬롯이 지정된 경우 이름은 이미 (으)로 할당되었습니다. 슬롯이 이미 할당되었는지 여부를 확인하기위한 방법은 없습니다 ( ).

관련 문제