2012-10-21 3 views
1

내 응용 프로그램에서 float 숫자 계산 (신경망)이 많이 발생하는 멀티 스레딩을 구현하려고합니다.배열을 업데이트하는 다중 스레드

필자는 함수 외부에 필요한 계산과 업데이트 배열을 만드는 함수를 작성했습니다. 내 실제, 단일 스레드 코드는 다음과 같습니다 (더 나은 이해를 위해 간체) :

class MyClass 
{ 
    // this array after all calculations should contain 
    // result of only one calculation, 
    // that returned smallest value in one of array fields 
    // (smallest neural network error) 
    float[] bestResult; 

    // runs calculations on all "sets of data" 
    public void findBestResult(void) 
    { 
     foreach (something...) // data rows from database cached in one array 
     { 
      calculate(x[]); 
     } 
    } 

    // calculates one "set of data" 
    public void calculateAndUpdateResultIfBetter(float[] inputData) 
    { 

     if (bestResult[0] > calculatedData[0]) 
      bestResult = calculatedData; // update only if condition is true 
    } 

} 

임 낮은 수준의 프로그래머, 내가 동기화를 사용하는 고급 .NET 스레딩 기술을 사용하는 방법을 모르는 (?) 등등. 뭔가 추가 스레드를 하나 만들고 대리자를 사용하여 폼의 일부 컨트롤을 업데이트하는 방법을 알고 있습니다.

정확하게 동일한 일을하고 서로 경쟁하는 2-8 스레드로 작업하는 방법을 알지 못합니다.

질문 1은 -이 문제를 해결할 수 있습니까? 나는 어떻게 시작 해야할지 모르겠다. Niko Drašković에 의해 해결됨

EDIT : 질문 2는 lock() 메소드가 읽기 및 쓰기 용으로 배열을 잠급니다.

+0

[잠금] (http://msdn.microsoft.com/en-us/library/c5kehkcz%28v=vs.80%29.aspx)을 보았습니까? – neeKo

+0

아니, 나는하지 않았다. 내 대답 인 것 같지만 팁이 좀 더 필요해. 추가 질문을 추가합니다. – Kamil

답변

5

lock 문을 사용하면 다른 스레드가 동시에 같은 코드를 실행하지 못하게 할 수 있습니다. 자물쇠의 식별자로 사용할 참조가 필요합니다.

lock (sync) { 
    if (bestResult[0] > calculatedData[0]) { 
    bestResult = calculatedData; 
    } 
} 

가 먼저 계산 각 스레드를 할 수 있습니다 : 당신이 lock 사용하는 배열에 액세스하는 코드 주위에 그런

float[] bestResult; 
object sync = new Object(); 

: 그것은 단지 잠금에 사용되는 간단한 객체를 생성하는 것이 일반적이다 그것이 책임지는 데이터 내에서 볼 수있는 최상의 가치, 그리고 그 최상의 가치를 결합하는 것입니다. 잠긴 코드를 너무 자주 실행하면 스레드가 서로를 기다리게되어 첫 번째 스레드에서 별도의 스레드를 실행해야하는 이유를 많이 잃게됩니다.

+0

코드에서 Hrmm bestResult가 동기화 객체 안에 없습니다. 이게 옳은 거니? – Kamil

+1

@ 카밀 : 예. 객체 참조는 식별자로만 사용되므로 모든 스레드가 잠금을 위해 동일한 모니터를 사용합니다. 'lock'은 쓰레드가 같은 코드 블록에 동시에 들어가는 것을 막을 뿐이며'lock' 문에서 사용하는 변수의 데이터를 보호하지 않습니다. – Guffa

+0

그 자물쇠를 어디에 두어야합니까? 내 계산 스레드에서? 또는 메인 어딘가에? 이제 코드 블록을 여러 스레드에서 실행하도록 잠그는 것에 대해 썼다면 몰라요 ... 내가 스레드 메서드에 넣을 때 동일한 코드 블록이되지 않을까요? – Kamil