2012-09-21 2 views
0

매초마다 지속적으로 업데이트되는 배열 목록이 있습니다. 두 개의 다른 스레드에서 동일한 배열 목록을 사용하고 로컬 복사본을 만들어야합니다. 나는이 모든 일을했지만 인덱스 바운드 이상한 예외를 얻을, 내가 지금까지 발견 한 배열 목록에 대한 몇 가지 동기화 메커니즘을 여러 스레드에서 사용할 수 있도록합니다. 또한?Arraylist 동기화 문제

ArrayList Local_Write_DMM4 = new ArrayList(); 
Local_Write_DMM4 = new ArrayList(Globls.Write_DataDMM4); 

내가 올바른 방법에서의 ArrayList를 동기화하는 건가요 : 다른 스레드에서

for (int i = 0; i < Globls.iterationCount; i++) 
      { 
       if (bw_Obj.CancellationPending) 
       { 
        eve.Cancel = true; 
        break; 
       } 

       byte[] rawData4 = DMM4.IO.Read(4 * numReadings); 
       TempDisplayData_DMM4.Add(rawData4); 
       Globls.Display_DataDMM4 = ArrayList.Synchronized(TempDisplayData_DMM4); 
       Globls.Write_DataDMM4 = ArrayList.Synchronized(TempDisplayData_DMM4); 

      } 

내가 로컬 복사본을 만들기 위해 다음을 수행하십시오

이 내가 그것을 동기화 만드는 중이라서 어떻게 배열 목록을 복사하는 동안 잠글 필요가 있습니까?

lock (Globls.Display_DataDMM4.SyncRoot){Local_Temp_Display1 = new ArrayList(Globls.Display_DataDMM4);} 

또는 단일 작업으로 안전합니까?. 나는 실제로이 코드를 실행하지 않았다. 나는 주말에 그것을 실행할 필요가 있고 또 다른 예외를보고 싶지 않다. (. 제발 도와주세요!)

+0

당신은 당신이 목표로하는 무엇을 설명 할 수 있습니까? 예외를 피하는 것은 그에 부수적입니다. 내용이 다른 목록이 포함 된 두 개의 스레드에 대해 걱정하십니까? 또는 다른 스레드가 읽는 동안 한 스레드가 목록 항목을 변경할 수 있다고 걱정합니까? – chris

+0

문제의 해결책 : [link] (http://stackoverflow.com/questions/1813557/c-sharp-list-concurrent-removing-and-adding) – Artless

+0

@chris arraylist는 결코 다른 내용을 가지고 있지 않습니다. 복사하는 동안 예외를 피하려고합니다. Local_Write_DMM4 = new ArrayList (Globls.Write_DataDMM4); 그리고 위의 접근 방식을 사용하여, 나는 내 주요 관심사 인 두 가지 질문을했습니다. – user1514077

답변

2

@Trickery가 할당 소스 배열 Globls.Write_DataDMM4 다른 스레드에 의해 수정 될 수 있기 때문에 고정 될 필요가 명시된 바와 같이. 열거 형의 경우 복사본을 만들 때 원래 배열 을 채울 때 모두 잠그는 것이 중요합니다.

for (int i = 0; i < Globls.iterationCount; i++) 
{ 
    if (bw_Obj.CancellationPending) 
    { 
     eve.Cancel = true; 
     break; 
    } 

    byte[] rawData4 = DMM4.IO.Read(4 * numReadings); 
    TempDisplayData_DMM4.Add(rawData4); 

    lock (Globls.Display_DataDMM4.SyncRoot) 
    { 
    Globls.Write_DataDMM4 = ArrayList.Synchronized(TempDisplayData_DMM4); 
    } 

} 

lock (Globls.Display_DataDMM4.SyncRoot) 
{ 
    Local_Temp_Display1 = new ArrayList(Globls.Display_DataDMM4); 
} 
+0

내가 과제를 수행하지 않으면 어떻게해야합니까? Globls.Write_DataDMM4 = ArrayList.Synchronized (TempDisplayData_DMM4); 대신 public static ArrayList를 초기화합니다. Write_DataDMM4 = ArrayList.Synchronized (new ArrayList()); 그리고 난 그냥 목록에 추가 Globls.Display_DataDMM4.Add (rawData); , 나는 데이터를 추가 할 때 arraylist를 동기화했다. 필요하다면 데이터를 잠글 수도있다. – user1514077

+0

'public static' 선언이 좋은 생각 일지 모르지만 여전히'.Add()'단계에서 잠글 필요가 있습니다. [이 기사] (http://blogs.technet.com/b/efleis/archive/2006/06/01/431698.aspx)를 참조하십시오. – chris

+0

글은 추가/제거를하는 것이 목록을 손상시키지 않는다고 언급합니다. 추가하지 않고 70 시간 동안 테스트해도 아무런 문제가 없었습니다. 감사합니다! – user1514077

1

예, ArrayList의 모든 조작에는 Lock .

는 편집 : 죄송합니다,이 사이트는 나에게 어떤 이유로 귀하의 질문에 댓글을 추가 할 수 없습니다