1에서 100까지의 병렬화에 대한 100 개의 레코드가 있습니다. 이제 Parallel.For를 사용하여 Parallel에서 다음과 같이 실행할 수 있습니다. 컴퓨팅 자원Parallel.For 루프 - 각 스레드에 대한 고유 한 데이터 엔티티 할당
Parallel.For(0, limit, i =>
{
DoWork(i);
});
있지만 특정 제한이에, 각 스레드는 동일한 데이터 엔티티와 함께 작동하도록해야합니다 및 데이터 엔티티의 수는 제한이 있습니다 서로 복제 및에 저장하여 고급에서 생성되는, 10 말 사전 또는 목록과 같은 구조. 이제 다음 코드를 사용하여 병렬화의 양을 제한 할 수 있습니다
Parallel.For(0, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i =>
{
DoWork(i);
});
을하지만 문제는 데이터 개체가 실행의 다른 현재의 thread가 사용되지 않도록, 각 수신 스레드에 대한 고유 데이터 엔티티를 할당하는 방법입니다 왜냐하면 스레드와 데이터 엔티티의 수가 동일하기 때문에 기아가 문제가되지 않기 때문입니다. 생각할 수있는 방법은 각 데이터 엔티티에 대해 부울 값을 작성하여 사용 중인지 여부를 지정하므로 사전 또는 목록을 반복하여 사용 가능한 다음 데이터 엔티티를 찾고 전반적인 할당 프로세스를 잠글 수 있습니다. 하나의 스레드는 주어진 시간에 데이터 엔티티를 할당 받지만이 문제는 훨씬 더 세련된 해결책이 될 것입니다. 제 버전은 해결 방법 일뿐 실제 수정 사항이 아닙니다. 내 논리는 다음과 같습니다
Parallel.For(0, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i =>
{
lock(All_Threads_Common_Object)
{
Check for available data entity using boolean
Assign the Data entity
}
DoWork(i);
Reset the Boolean value for another thread to use it
});
이 문제는 더 해명
필요한 패턴은 생산자 - 소비자가 수정됩니다. 프로듀서는 처음 엔 10 개의 엔티티를 추가하고 고객은 엔티티를 얻으려고합니다. 엔티티가 10 개있을 때 나머지 스레드는 제작자가 새 항목을 넣길 기다립니다. 소비자 작업이 끝나면 엔티티가 생산자 스택에 다시 저장됩니다. –
@pwas 그것이 생산자 소비자가 아니라 객체 풀링입니다. 어쨌든 Parallel.For를 사용하면 잠금 초기화 또는 풀링없이 각 스레드에 고유 한 객체를 전달하는 스레드 초기화 함수를 지정할 수 있습니다. –