use Exporter ...
- это сокращение от
BEGIN {
require Exporter;
Exporter->import(...);
}
. Вместо этого, сказав require Exporter
, вы пропускаете вызов методу Exporter
import
.
Вам также придется разобраться с правильной проблемой имени пакета / файла, как намекает комментарий zdim.
Простой поиск в Google обнаружит множество документов с двусвязными списками без блокировки.
Однако они основаны на атомарном CAS (сравнение и обмен).
Я не знаю насколько атомарны операции в C #, но согласно этому сайту
http://www.albahari.com/threading/part4.aspx
Операции C # гарантированно атомарны только для чтения и записи 32-битного поля. Никакого упоминания о CAS.
Я не верю, что это возможно, поскольку вам нужно установить несколько ссылок в одном кадре, а возможности взаимосвязанных операций ограничены.
Например, возьмите операция добавления - если вы вставляете узел B между A и C, вам нужно установить B-> next, B-> prev, A-> next и C-> prev за одну атомарную операцию. Interlocked не может с этим справиться. Предварительная установка элементов B даже не помогает, потому что другой поток может решить сделать вставку, пока вы готовите «B».
Я бы больше сосредоточился на получении как можно более детальной блокировки в этом случае, а не пытаясь устранить его.
Я бы сказал, что ответ очень глубокий: «да, это возможно , но сложно». Чтобы реализовать то, о чем вы просите, вам в основном понадобится что-то, что скомпилирует операции вместе, чтобы гарантировать отсутствие коллизий; как таковой, было бы очень сложно создать общую реализацию для этой цели, и она все еще имела бы некоторые существенные ограничения. Вероятно, было бы проще создать конкретную реализацию, адаптированную к конкретным потребностям, и даже в этом случае она никоим образом не будет «простой».
Вот статья , в которой описывается двусвязный список без блокировок.
Мы представляем эффективный и практичный безблокировочная реализация одновременная двухсторонняя очередь, то есть дизъюнктно-параллельный доступ и использование атомарные примитивы, которые доступны в современных компьютерных системах. Ранее известные lock-free алгоритмы дек либо основаны на недоступности атомарные примитивы синхронизации, реализовать только подмножество функциональность, или не предназначены для непересекающиеся доступы. Наш алгоритм на основе двусвязного списка, и требуется только одно слово сравнить-и-обменять ...
Росс Бенцина имеет несколько действительно хороших ссылок, которые я только что нашел с многочисленными статьями и примерами исходного кода для « Некоторые примечания по алгоритмам без блокировки и без ожидания ».
FWIW, .NET 4.0 добавляет ConcurrentLinkedList, потокобезопасный двусвязный список в пространстве имен System.Collections.Concurrent. Вы можете прочитать документацию или запись в блоге , описывающую это.
Прочтите сноску - они планируют вытащить ConcurrentLinkedList из 4.0 до окончательной версии VS2010