Блокировка свободных конструкций в .net - PullRequest
5 голосов
/ 29 ноября 2008

Я новичок в .net и хотел бы знать, имеет ли .net Java-эквивалент AtomicInteger, ConcurrentLinkedQueue и т. Д.?

Я немного искал и ничего не смог придумать.

Алгоритмам без блокировки нужна какая-то инструкция CAS, которая предоставляется через недокументированный класс Unsafe в Java, имеет ли .net что-нибудь эквивалентное?

Ответы [ 5 ]

6 голосов
/ 29 ноября 2008

В .NET есть класс Interlocked, со статическими методами Interlocked.Increment () и Interlocked.Decrement ().

См. http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx.

Вы также найдете другие атомарные конструкции синхронизации och в пространстве имен System.Threading.

4 голосов
/ 29 ноября 2008

Я написал большое количество свободных от блокировки неизменяемых структур коллекций в .Net. Сюда входят двоичные деревья, карты, массивы, связанный список и т. Д. Исходный код и двоичные файлы доступны в галерее кода

RantPack

2 голосов
/ 29 ноября 2008

Класс Interlocked имеет все статические методы, необходимые для выполнения простых атомарных операций, таких как увеличение, уменьшение, сравнение, свопинг и т. Д. Проверьте http://msdn.microsoft.com/en-us/library/system.threading.interlocked_members.aspx

Для большинства коллекций вы можете получить синхронизированную коллекцию через статический член с именем «Синхронизированный». Однако обратите внимание, что это не конструкции без блокировок, они просто скрывают беспорядок использования блокировок / семафоров. Проверьте синхронизированный метод коллекции очереди http://msdn.microsoft.com/en-us/library/system.collections.queue.synchronized.aspx

0 голосов
/ 29 ноября 2008

Вот проблема, с которой я сталкиваюсь в классе блокировки .net.

У меня есть несколько потоков, обновляющих счетчик. Каждый поток должен получить уникальное значение счетчика, поэтому ни один из потоков не должен получить одно и то же значение.

Как работает блокированный класс в .net, у меня -

int counter;
void code(){
    myThreadVal = Interlocked.increment(counter);
}

теперь, поскольку оба потока могут видеть одно и то же значение счетчика, они оба могут получить одно и то же значение myThreadVal.

Тем не менее, в случае java AtomicInteger, который никогда не произойдет, каждый поток всегда будет иметь различное значение.

0 голосов
/ 29 ноября 2008

Для информации, вероятно ( здесь ), что .NET 4.0 унаследует CCR / TPL от Parallel Extensions . В частности, TPL представляет диапазон коллекций и других конструкций, разработанных для сложных сценариев потоков (с минимальными блокировками и т. Д.).

На данный момент существует ограниченное количество многопоточных коллекций и т. Д., Плюс обычные блокирующие примитивы, плюс Interlocked и т. Д.

...