неблокирующий производитель и потребитель, использующий .NET 2.0 - PullRequest
3 голосов
/ 03 июня 2011

В нашем сценарии

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

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

Мы еще не можем использовать .NET 4.0 в нашей организации.

Ответы [ 3 ]

1 голос
/ 03 июня 2011

Отличный пример очереди производителя / потребителя с использованием мониторов на на этой странице в разделе «Очередь производителя / потребителя».Для синхронизации доступа к базовой таблице данных у вас может быть один потребитель.

Эта страница, вероятно, является лучшим ресурсом для многопоточности в .NET в сети.

0 голосов
/ 03 июня 2011

Не существует волшебной пули, которая позволила бы вам получить доступ к DataTable из нескольких потоков без использования механизма синхронизации блокировки. Что я хотел бы сделать, так это держать замок как можно более коротким. Имейте в виду, что изменение любого объекта в иерархии таблицы данных потребует блокировки всей таблицы данных. Это связано с тем, что изменение значения столбца в DataRow может изменить внутренние структуры индексации внутри родительского элемента DataTable.

Итак, я хотел бы, чтобы производитель получил блокировку, добавил новую строку и снял блокировку. Затем в conumser вы получите такую ​​же блокировку, скопируете данные, содержащиеся в DataRow, в отдельную структуру данных, а затем немедленно снимите блокировку. Теперь вы можете работать с скопированными данными без механизмов синхронизации, поскольку они изолированы. После того, как вы завершили операцию над ним, вы снова получите блокировку, объедините изменения обратно в DataRow, затем снимите блокировку и начните процесс заново.

0 голосов
/ 03 июня 2011

Создать буфер, в котором хранятся данные во время их обработки.

На обработку у вас уходит полсекунды, а вы получаете 8 элементов в секунду ... если у вас не работает хотя бы 4 процессора, у вас возникнет проблема.

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

...