Я новичок в алгоритмах без блокировки и пытаюсь реализовать Stack , которая является самой простой структурой данных без блокировки. Вот моя реализация ограниченного стека на основе блокировки на основе массива. < /P>
public class ConcurrentArrayStack implements Stack {
private final AtomicInteger size;
private final T array[];
public ConcurrentArrayStack(int maxCapacity) {
this.array = (T[]) new Object[maxCapacity];
this.size = new AtomicInteger(0);
}
@Override
public T push(T t) {
if(t == null) {
throw new NullPointerException("Null values are not allowed");
}
int currentSize;
T currentValue;
do {
currentSize = size.get();
if(currentSize == array.length) {
return null;
}
currentValue = array[currentSize];
} while(currentValue != null || !size.compareAndSet(currentSize, currentSize + 1));
array[currentSize] = t;
VarHandle.fullFence(); // в конце каждого метода заключается Барьер компилятора (промыть любое ожидающее чтение/запись на уровне компилятора) Нам не нужен забор между нагрузкой от массива и хранением до массива, поскольку нагрузки не переупорядочиваются в более ранние магазины (x86). < /li>
< /ol>
[b] Вопрос: [/b] то, что я не мог проверить, что Fullfence
строго говорит здесь и не может быть заменена на --
Я новичок в алгоритмах без блокировки и пытаюсь реализовать Stack , которая является самой простой структурой данных без блокировки. Вот моя реализация ограниченного стека на основе блокировки на основе массива. < /P> [code]public class ConcurrentArrayStack implements Stack { private final AtomicInteger size; private final T array[];
public ConcurrentArrayStack(int maxCapacity) { this.array = (T[]) new Object[maxCapacity]; this.size = new AtomicInteger(0); }
@Override public T push(T t) { if(t == null) { throw new NullPointerException("Null values are not allowed"); }
int currentSize; T currentValue; do { currentSize = size.get(); if(currentSize == array.length) { return null; } currentValue = array[currentSize]; } while(currentValue != null || !size.compareAndSet(currentSize, currentSize + 1)); array[currentSize] = t; VarHandle.fullFence(); // в конце каждого метода заключается Барьер компилятора (промыть любое ожидающее чтение/запись на уровне компилятора) Нам не нужен забор между нагрузкой от массива и хранением до массива, поскольку нагрузки не переупорядочиваются в более ранние магазины (x86). < /li> < /ol> [b] Вопрос: [/b] то, что я не мог проверить, что Fullfence [/code] строго говорит здесь и не может быть заменена на --[code]release[/code]. Возможно ли что -то подобное?
Я новичок в алгоритмах без блокировки и пытаюсь реализовать Stack , которая является самой простой структурой данных без блокировки. Вот моя реализация ограниченного стека на основе блокировки на основе массива.
public class ConcurrentArrayStack...
Я новичок в алгоритмах без блокировки и пытаюсь реализовать Stack , которая является самой простой структурой данных без блокировки. Вот моя реализация ограниченного стека на основе блокировки на основе массива.
public class ConcurrentArrayStack...
Я только изучаю использование ограничений захвата и освобождения памяти и не понимаю, почему иногда я получаю на выходе значение равное нулю, а не значение 2 все время
Я запускал программу несколько раз и предполагал, что атомарное хранилище до...
Я читаю книгу «Программирование массовых параллельных процессоров» и заметил приведенные ниже фрагменты кода для достижения «Сканирования в стиле домино»:
if (threadIdx.x == 0) {
while(AtomicAdd(&flags , 0) == 0) {}
// ???? why do I not need...
Я читаю книгу «Программирование массовых параллельных процессоров» и заметил приведенные ниже фрагменты кода для достижения «Сканирования в стиле домино»:
if (threadIdx.x == 0) {
while(AtomicAdd(&flags , 0) == 0) {}
// ???? why do I not need...