Путаница из-за выполнения Thread.Foreach - Отсутствие попадания в C # - PullRequest
0 голосов
/ 30 декабря 2011

Я пытаюсь выяснить, почему написанный мной параллельный код пропускает некоторые строки, которые я пытаюсь искать параллельно.

Вот что у меня есть - StringCollection - это словарь.С ключом, являющимся хэшем и значением некоторой строки.Всего есть четыре словаря, которые нужно искать.- InputStrings [] - это массив строк, точнее 10, которые мне нужно искать.

В моем коде у меня есть

Paralle.Foreach(InputStrings,currentString =>
{
  int key = some hashing function on currentString;
  if(SearchCollection(key))// boolean result
   {
     Console.WriteLine("Found:"+key);
   }
   else 
   {
    Console.WriteLine("Not Found:"+key);
  }
});

Как только я выполню это, я найду 8 или9 ключей, и пропустите один или два ключа.Я знаю, что коллекция содержит все ключи, которые я пытаюсь найти.Поиск ключа модифицируется внутри функции для дальнейшего поиска при определенных условиях.То есть ключ модифицируется и передается в некоторый подсловарь для поиска.

Таким образом, я поднимаю следующие пункты:

Означает ли это, что потоки выходят до завершения?Нужно ли устанавливать блокировки над моим методом SearchCollection или внутри моего метода SearchCollection?Поскольку я использую одну коллекцию для всех потоков, TPL заботится о блокировке или создает копии самой коллекции, которую я пытаюсь найти?

Любая помощь очень важна.Спасибо

1 Ответ

1 голос
/ 30 декабря 2011

Ваш SearchCollection и / или ваш хеширующий код не являются поточно-ориентированными.

Обычно безопасно использовать коллекцию только для чтения из нескольких потоков, но это зависит от реализации.

Вы не предоставили достаточно информации для дальнейшего анализа.

...