У меня есть 100 записей для Parallelization, от 1 до 100. Теперь я могу удобно использовать Parallel.For для их выполнения в Parallel следующим образом, который будет работать на основе на вычислительных ресурсахParallel.For loop - Назначение уникального объекта данных для каждого потока
Parallel.For(0, limit, i =>
{
DoWork(i);
});
но существует определенные ограничения, каждый поток должен работать с идентичным объектом данных и существует ограниченное число субъектов данных говорят 10, которые создаются в передовом клонировании друг друга и сохранять их в такой как словарь или список. Теперь я могу ограничить количество распараллеливания, используя следующий код:
Parallel.For(0, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i =>
{
DoWork(i);
});
Но вопрос заключается в том, чтобы присвоить уникальный объект данных для каждого входящего потока, таким образом, что объект данных не используются каким-либо другой текущим потоком исполнения , так как число потоков и объект данных одинаковы, поэтому голодание не является проблемой. Я могу представить себе путь, в котором я создаю логическое значение для каждого объекта данных, указывая, используется ли оно или нет, и поэтому мы перебираем через словарь или список, чтобы найти следующий доступный объект данных и заблокировать общий процесс присваивания, одному потоку назначается объект данных в данный момент времени, но, на мой взгляд, эта проблема будет иметь гораздо более элегантное решение, моя версия - всего лишь обходной путь, а не исправление. Моя логика:
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 сущностей в начале, клиенты пытаются получить entites. Когда 10 объектов получены, остальные потоки ожидают, что производитель поместит новые элементы. Когда потребительское задание заканчивается, он возвращает объект обратно в стек производителя. –
@pwas - это объединение объектов, а не производитель. В любом случае Parallel.For позволяет вам указать функцию инициализации потока для передачи уникального объекта в каждый поток без блокировки или объединения. –