Я читаю книгу о параллельном программировании, в которой говорится, что нельзя добавлять потоки в список без использования блокировки, поскольку результат будет непредсказуемым.Например, если нам нужно добавить 800 000 элементов в список, конечный результат будет содержать менее 800 000 элементов.
Теперь мне интересно, если это сохранение потока в чтение элементов из списка,Например, допустим, у меня есть список BlackListedNumbers
List<int> BlackListedNumbers = new List<int> {10, 50 ....... n};
//lets say there is 500 000 elements in the list
и еще один список Numbers
, содержащий 10 000 000 чисел, очевидно, что я буду использовать параллель.Final
список, содержащий все числа из Numbers
, которых нет в BlackListedNumbers
списке
List<int> finalList = new List<int>();
Parallel.ForEach(Numbrs,
num =>
{
if (!blackListedNumbrs.Contains(num))
{
lock (finalList)
{
finalList.Add(num);
}
}
});
Я знаю, что это не самый эффективный способ сделать это, но я просто пытаюсь проиллюстрироватьэта проблема.
Итак, мой вопрос: сохранить ли нить, чтобы прочитать результат из списка blackListedNumbrs
, и получу ли я 100% точные результаты?