Блокировка (ожидают) бесплатный возможный двунаправленный связанный список?

use Exporter ... - это сокращение от

BEGIN {
    require Exporter;
    Exporter->import(...);
}

. Вместо этого, сказав require Exporter, вы пропускаете вызов методу Exporter import.

Вам также придется разобраться с правильной проблемой имени пакета / файла, как намекает комментарий zdim.

9
задан Quonux 15 September 2013 в 00:06
поделиться

6 ответов

Простой поиск в Google обнаружит множество документов с двусвязными списками без блокировки.

Однако они основаны на атомарном CAS (сравнение и обмен).

Я не знаю насколько атомарны операции в C #, но согласно этому сайту

http://www.albahari.com/threading/part4.aspx

Операции C # гарантированно атомарны только для чтения и записи 32-битного поля. Никакого упоминания о CAS.

11
ответ дан 4 December 2019 в 06:41
поделиться

Я не верю, что это возможно, поскольку вам нужно установить несколько ссылок в одном кадре, а возможности взаимосвязанных операций ограничены.

Например, возьмите операция добавления - если вы вставляете узел B между A и C, вам нужно установить B-> next, B-> prev, A-> next и C-> prev за одну атомарную операцию. Interlocked не может с этим справиться. Предварительная установка элементов B даже не помогает, потому что другой поток может решить сделать вставку, пока вы готовите «B».

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

2
ответ дан 4 December 2019 в 06:41
поделиться

Я бы сказал, что ответ очень глубокий: «да, это возможно , но сложно». Чтобы реализовать то, о чем вы просите, вам в основном понадобится что-то, что скомпилирует операции вместе, чтобы гарантировать отсутствие коллизий; как таковой, было бы очень сложно создать общую реализацию для этой цели, и она все еще имела бы некоторые существенные ограничения. Вероятно, было бы проще создать конкретную реализацию, адаптированную к конкретным потребностям, и даже в этом случае она никоим образом не будет «простой».

-1
ответ дан 4 December 2019 в 06:41
поделиться

Вот статья , в которой описывается двусвязный список без блокировок.

Мы представляем эффективный и практичный безблокировочная реализация одновременная двухсторонняя очередь, то есть дизъюнктно-параллельный доступ и использование атомарные примитивы, которые доступны в современных компьютерных системах. Ранее известные lock-free алгоритмы дек либо основаны на недоступности атомарные примитивы синхронизации, реализовать только подмножество функциональность, или не предназначены для непересекающиеся доступы. Наш алгоритм на основе двусвязного списка, и требуется только одно слово сравнить-и-обменять ...

Росс Бенцина имеет несколько действительно хороших ссылок, которые я только что нашел с многочисленными статьями и примерами исходного кода для « Некоторые примечания по алгоритмам без блокировки и без ожидания ».

4
ответ дан 4 December 2019 в 06:41
поделиться

FWIW, .NET 4.0 добавляет ConcurrentLinkedList, потокобезопасный двусвязный список в пространстве имен System.Collections.Concurrent. Вы можете прочитать документацию или запись в блоге , описывающую это.

0
ответ дан 4 December 2019 в 06:41
поделиться

Прочтите сноску - они планируют вытащить ConcurrentLinkedList из 4.0 до окончательной версии VS2010

1
ответ дан 4 December 2019 в 06:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: