Как правило, это плохая идея - писать такой код самостоятельно .
Однако, если вы действительно хотите написать такой код, я говорювозьмите страницу из книги Эрика Липперта (или как бы блога) , где в основном вы реализуете очередь, но вместо того, чтобы все функции, вносящие изменения в очередь, изменяли экземпляр, вызываемый вами методомon, методы возвращают совершенно новые экземпляры очереди.
Это семантически похоже на шаблон, который System.String
использует для поддержания неизменности;все операции возвращают новый System.String
, оригинал не изменяется.
В результате вы вынуждены переназначать ссылку, возвращаемую при каждом вызове.Поскольку присвоения ссылок являются атомарными операциями, безопасность потоков не беспокоится;вам гарантировано, что чтение / запись будут атомарными.
Однако это приведет к ситуации с последним выигрышем;возможно, что в очередь вносятся многочисленные изменения, но будет удерживаться только последнее назначение, при этом другие вставки будут потеряны в очереди.
Это может быть приемлемо;если нет, вы должны использовать синхронизацию вокруг назначения и чтения ссылки.У вас по-прежнему будет очередь с приоритетом без блокировки, но если у вас есть проблемы с безопасностью потоков и сохранением целостности операций, вы ничего не сделали, кроме как перенесли проблему синхронизации за пределы структуры данных (что практически во всех случаях)., это хорошая вещь, так как она дает вам точный явный контроль).