Что произойдет с небезопасным объектом очереди .NET?

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

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

На мой взгляд, параллелизм приведет только к потере данных.

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


person Sunf71    schedule 14.01.2010    source источник
comment
Можете ли вы рассказать нам, какой механизм вы используете для блокировки? например с ОЧЕНЬ коротким образцом кода.   -  person Binary Worrier    schedule 14.01.2010
comment
Проблемы с параллелизмом вызывают повреждение или несогласованность данных. Это может быть потеря данных, повторяющиеся данные, поврежденные данные или даже исключение. Что произойдет, зависит от вашей реализации. Не видя примера того, что вы делаете, никто не может понять, в чем ваша проблема.   -  person shf301    schedule 14.01.2010
comment
Спасибо за ваши комментарии! я просто использую монитор для блокировки get {Monitor.Enter (mQueue); byte [] данные = mQueue.Dequeue (); Monitor.Exit (mQueue); вернуть данные; } установить {Monitor.Enter (mQueue); mQueue.Enqueue (значение); Monitor.Exit (mQueue); } что с этим не так?   -  person Sunf71    schedule 17.01.2010


Ответы (2)


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

person Hans Passant    schedule 14.01.2010

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

person Henrik    schedule 14.01.2010