Что произойдет в небезопасном объекте очереди .NET? - PullRequest
0 голосов
/ 14 января 2010

У меня есть объект очереди .NET. Поток производителя выполняет операцию Enqueue, данные, помещенные в очередь, являются массивом byte [], тогда как другой поток-потребитель выполняет операцию Dequeue для того же объекта очереди.

Я использую блокировки для обработки параллелизма. Кажется, мой код все время работает нормально, но вчера произошли странные вещи. Данные, которые я получил из потока потребителя, отличались от данных, которые я произвел: неверная длина массива, повторный массив ... Это вызвано отказавшей защитой потока?

По моему мнению, параллелизм может привести только к потере данных.

Мой первый пост здесь, терпите меня.

Ответы [ 2 ]

0 голосов
/ 14 января 2010

Это гораздо хуже, чем простая потеря данных. Класс Queue может перераспределить свой внутренний буфер, когда это необходимо для размещения растущего числа элементов. Неправильная блокировка может получить доступ к новому буферу со старыми значениями индексов головы и хвоста. Вы получите исключение только тогда, когда вам повезет, более вероятно, что вы просто ошиблись элементом.

0 голосов
/ 14 января 2010

Поток производителя не должен хранить ссылку на массив и изменять его после того, как он помещен в очередь. Всегда создавайте новый массив. (Я могу констатировать очевидное, но без дополнительной информации трудно добиться большего успеха)

...