2017-02-09 1 views
-1
내가 병렬 다중 스레드 내가 알고 싶은
Parallel.Invoke(action, action, action, action, action, action, action, action, action, action, action, action, action, action, action); 

동시 큐 디큐

을 동시 큐를 사용하여이 작업 대리자를 만드는 작업 위임

Action action =() => 
     { 
      SubscriptionResponseModel subsModel; 
      while (concurrentQueue.TryTake(out subsModel)) 
      { 
       MakeTransactionAndAddIntoQueue(subsModel); 
      } 
     }; 

여러 개의 스레드를 통해 큐의 데이터를 큐에서 제거 그리고 호출하고

한 가지 내가 여러 작업에서 SubscriptionResponseModel subsModel;을 사용할 때 스레드 안전합니까?.

+0

에 따라 다릅니다 SubscriptionResponseModel – Trey

+2

무엇입니까 * 나는 평행 우리는이 작업을 수행 할 수있는 방법을 내 동시 큐를 소비하려면 –

답변

1

action을 호출 할 때마다 subsModel이됩니다. 따라서 대기열에서 값을 가져 오는 데 스레드를 사용하면 스레드로부터 안전합니다.

// ********** Code showing non-thread safe case ************** 
    SubscriptionResponseModel subsModel; 
    Action action =() => 
    { 
     // all invocations of `action` will share subsModel as it is captured. 
     while (concurrentQueue.TryDequeue(out subsModel)) 
     { 
      MakeTransactionAndAddIntoQueue(subsModel); 
     } 
    }; 

참고 :

  • 여부 또는 속성을 사용하지 않는 /를 SubscriptionResponseModel의 방법은 스레드가 당신 캡처 외부 상황에서 변수가 때 스레드 안전하지 않을

    케이스입니다 안전은 그 유형에 달려 있습니다.

  • TryDequeue을 여러 번 실행해도 성능이 향상되지 않을 가능성이 있습니다. Parallel.Invoke 여러 개의 통화 중 루프는 빈 큐를 계속 쿼리하는 둘 이상의 스레드를 단순히 차단합니다.
+0

을 SubscriptionResponseModel''귀하의 * 구현? 위의 예에서 내가하고있는 바른 길입니다. 원하는 게시물을 얻을 수 있도록 @maheshsharma 코드 –

+0

을 제안하십시오. 그것은 당신의 임무가 당신에게 달려 있음이 실제로 유용합니까? 실제 목표를 달성하는 더 나은 방법에 대해 별도의 질문을하고 싶을 수도 있습니다. 코드의 모든 부분이 "동시 대기열을 병렬로 사용"할 가능성은 거의 없습니다. 새로운 질문을하는 경우 실제 사용 시나리오를 추가하십시오. –