2010-05-08 2 views
0

우리는 construtor에서 데이터를 반환하기 위해 콜백 스레드를 사용하는 외부 데이터 공급자가 있습니다.GUI 쓰레드에 대한 모든 콜백 - 멀티 쓰레딩 문제는 가능한가?

스레딩과 관련된 시스템에서 몇 가지 문제가 있지만 이론 상으로는 콜백이 모두 같은 스레드에서 반환되어야하기 때문에 불가능할 수 있습니다.

제 질문은 스레드 코드가 필요합니까?

class Foo 
    { 
     ExternalDataProvider _provider; 

     public Foo() 
     { 
     // This is the c'tor for the xternal data provider, taking a callback loop as param 
     _provider = new ExternalDataProvider(UILoop); 
     _provider.DataArrived += ExternalProviderCallbackMethod; 

     } 
     public ExternalProviderCallbackMethod(...) 
     { 
//...(code omitted) 
     var itemArray[] = new String[4] { "item1", "item2", "item3", "item4" }; 
     for (int i = 0; i < itemArray.Length; i++) 
     { 
      string s = itemArray[i]; 
      switch(s) 
      { 
       case "item1": 
        DoItem1Action(); 
        break; 
       case "item2": 
        DoItem2Action(); 
        break; 
       default: 
        DoDefaultAction(); 
        break;    
      } 
      //...(code omitted)  
     } 
     } 
    } 

문제

은 매우 드물게, DoItem2Action이 DoItem1Action가 exectuing해야 executingwhen되어 있다는 점이다.

실을 꿰는 것은 가능합니까? 이론 상으로는 모든 콜백이 같은 스레드에 도착하기 때문에 직렬화되어야합니다. 맞습니까? 그래서 여기에 스레드 동기화가 필요하지 않아야합니까?

답변

1

콜백 메서드가 모두 reentrant이므로 이러한 콜백이 동일한 스레드에 없더라도 문제의 원인이 될 수 없습니다. 동기화 할 수있는 방법은 없습니다.

문제는 다른 곳에서해야한다, 또는 내가 제대로 문제를 이해 아니에요 :)


PS를 :

따라서 재진입 성이 없습니다. 받아 들여진 답변은 스레드가 안전하지 않은 이유를 지적합니다.

+0

감사합니다. 이것은 매우 못생긴 코드의 간소화 된 버전이지만, 재진입 문서는 매우 흥미 롭습니다. – miguel

+0

이것은 다른 스레딩 스레드의 첫 번째 응답이 재진입 적이므로 스레드 안전성을 의미하지 않습니까? http://stackoverflow.com/questions/2779649/thread-local-storage-and-local-method-variables – miguel

+0

또한 액션 메소드가 재진입한다는 보장은 없습니까? – miguel

관련 문제