2013-02-05 2 views
-3

안녕 얘들을 복원하려면 :내가 같은 루프가 큐 회원에게

for (int i = 0; i < 5; i++) 
{ 
    lock (locker) 
    { 
     if (passwords.Count == 0) 
     { 
      proxy_loop = false; 
      break; 
     } 
     else 
     { 
      password = passwords.Dequeu(); 
      j++; 
     } 
    } 
} 

루프가 나는 내용 (즉, 처음에 있었다) 무슨 암호가

+8

대기열의 복원이 끝나는 문제? – 75inchpianist

+4

루프 내부를 자물쇠로 감싼 사실 때문에 여러 스레드가 관련되어 있다면 수행하려는 작업 (대기열 복원)에 많은 어려움이있을 수 있다고 생각하게 만듭니다. – hatchet

답변

1
 Queue backup = (Queue) passwords.Clone(); 
     for (int i = 0; i < 5; 6++) 
     { 
      lock (locker) 
      { 
       if (passwords.Count == 0) 
       { 
        proxy_loop = false; 
        break; 
       } 
       else 
       { 
        string password = (string) passwords.Dequeue(); 

        j++; 
       } 
      } 
     } 
     passwords = backup; 
+1

+1 전반적인 사용법/문맥에 따라 (분명히 우리에게는 없지만) 루프 내에서'backup'을 사용하고'passwords' 큐를 변경하지 않는 것이 더 합리적 일 수 있습니다. –

+0

스레딩이 구현되어 있으면 깨끗하고 효율적인 방법이 아니지만 작업을 수행 할 것이라고 생각합니다! –

+1

@ChrisSinclair가 말한 것에 덧붙여, 백업에서 작동하는 또 다른 장점은 더 이상 루프에서 잠금을 필요로하지 않는다는 것입니다 (복제본 주위에 하나만 있음). 가지고있는 것처럼, 전체 코드 블록을 자물쇠에 싸야 할 수도 있습니다. 그렇지 않으면 첫 번째 스레드가 for 루프의 중간에 있고 다른 스레드가 따라오고 동일한 작업을 수행하면 부분적으로 수정 된 코드를 사용하여 백업합니다 암호. ConcurrentQueue를 사용하면 도움이 될 수도 있습니다. – hatchet

관련 문제