Очередь приоритетов без блокировки в C # - PullRequest
8 голосов
/ 15 мая 2011

В последнее время я искал информацию о том, как создать приоритетную очередь без блокировки в C #.Мне еще предстоит найти реализацию на любом языке или приличную статью по этому вопросу.Я обнаружил несколько статей, которые кажутся копиями или, по крайней мере, ссылаются на одну конкретную статью, которая на самом деле не является бумагой в очередях без блокировки с приоритетом, несмотря на ее название;на самом деле это бумага в очереди с приоритетами, в которой используются мелкозернистые блокировки.

Ответы, которые я получаю из других источников, включают «использовать один поток» и «вам не нужно, чтобы он был свободен от блокировки» и"это невозможно".Все три ответа неверны.

Если у кого-то есть информация по этому поводу, я был бы очень признателен.

Ответы [ 2 ]

5 голосов
/ 15 мая 2011

Как правило, это плохая идея - писать такой код самостоятельно .

Однако, если вы действительно хотите написать такой код, я говорювозьмите страницу из книги Эрика Липперта (или как бы блога) , где в основном вы реализуете очередь, но вместо того, чтобы все функции, вносящие изменения в очередь, изменяли экземпляр, вызываемый вами методомon, методы возвращают совершенно новые экземпляры очереди.

Это семантически похоже на шаблон, который System.String использует для поддержания неизменности;все операции возвращают новый System.String, оригинал не изменяется.

В результате вы вынуждены переназначать ссылку, возвращаемую при каждом вызове.Поскольку присвоения ссылок являются атомарными операциями, безопасность потоков не беспокоится;вам гарантировано, что чтение / запись будут атомарными.

Однако это приведет к ситуации с последним выигрышем;возможно, что в очередь вносятся многочисленные изменения, но будет удерживаться только последнее назначение, при этом другие вставки будут потеряны в очереди.

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

3 голосов
/ 15 мая 2011

Искусство многопроцессорного программирования .Посмотрите на Главу 15 - Очереди приоритетов.Книга написана на Java, но может быть легко переведена на C #, поскольку у них обоих есть GC (что важно для большинства реализаций в книге).

...