Size: a a a

2020 November 18

MS

Mikola Summer Duck in pro.algorithms
Можно но тогда лучше три вектора сделай.
источник

АК

Александр Караев... in pro.algorithms
Mikola Summer Duck
Ну это массив мютексов лочащих структуры с мютексами.
там один мьютекс, и то не мьютекс, а атомик
источник

MS

Mikola Summer Duck in pro.algorithms
Александр Караев
там один мьютекс, и то не мьютекс, а атомик
Неа, в твоём случае твой атомик будет мьютексом.
источник

АК

Александр Караев... in pro.algorithms
Mikola Summer Duck
Неа, в твоём случае твой атомик будет мьютексом.
в какой момент?
источник

MS

Mikola Summer Duck in pro.algorithms
Атомик над произвольной структурой превращается в мютекс оборачивающий эту структуру
источник

MS

Mikola Summer Duck in pro.algorithms
Имплементейшн дефайнд конечно
источник

MS

Mikola Summer Duck in pro.algorithms
Но врядли компилятор вставит туда спинлок
источник

АК

Александр Караев... in pro.algorithms
а, атомик над указателем.. ну хорошо, да
источник

m

magras in pro.algorithms
Mikola Summer Duck
Атомик над произвольной структурой превращается в мютекс оборачивающий эту структуру
Там атомик над shared_ptr. В С++20 есть явная специализация под этот кейс. Правда зуб не дам, что она гарантирует is_always_lockfree == true.
источник

АК

Александр Караев... in pro.algorithms
std::atomic<std::shared_ptr<const FUNCTIONS>> pool;

итерация:

for (const auto& f : *pool) {
 f();
}

модификация:

FUNCTIONS functions = *pool;
functions.erase(..)
pool = std::make_shared<const FUNCTIONS>(std::move(functions));
источник

MS

Mikola Summer Duck in pro.algorithms
Александр Караев
std::atomic<std::shared_ptr<const FUNCTIONS>> pool;

итерация:

for (const auto& f : *pool) {
 f();
}

модификация:

FUNCTIONS functions = *pool;
functions.erase(..)
pool = std::make_shared<const FUNCTIONS>(std::move(functions));
Ты не защитишь данные таким образом.
источник

АК

Александр Караев... in pro.algorithms
Mikola Summer Duck
Ты не защитишь данные таким образом.
какие данные? :)
у меня const FUNCTIONS, они иммутабельны
источник

MS

Mikola Summer Duck in pro.algorithms
А
источник

MS

Mikola Summer Duck in pro.algorithms
Я не понял, это не похоже на ранее описанную задачу с коллбеками.
источник

АК

Александр Караев... in pro.algorithms
это ровно она
источник

m

magras in pro.algorithms
magras
Там атомик над shared_ptr. В С++20 есть явная специализация под этот кейс. Правда зуб не дам, что она гарантирует is_always_lockfree == true.
Да, если верить cppref, гарантии нет. =(
источник

АК

Александр Караев... in pro.algorithms
Mikola Summer Duck
Я не понял, это не похоже на ранее описанную задачу с коллбеками.
в пуле лежат некоторые коллбэки, когда их надо вызвать - я копирую указатель, итерируюсь по всем коллбэкам и вызываю их по очереди.
если один из коллбэков решит модифицировать пул - он сделает его копию, поменяет по своему желанию, и запихнёт обратно в указатель (на внешнюю итерацию это никак не повлияет)
источник

MS

Mikola Summer Duck in pro.algorithms
Александр Караев
в пуле лежат некоторые коллбэки, когда их надо вызвать - я копирую указатель, итерируюсь по всем коллбэкам и вызываю их по очереди.
если один из коллбэков решит модифицировать пул - он сделает его копию, поменяет по своему желанию, и запихнёт обратно в указатель (на внешнюю итерацию это никак не повлияет)
Делать копию пула каждый раз когда хочешь его изменить?
источник

MS

Mikola Summer Duck in pro.algorithms
Лучше сделай три массива
источник

АК

Александр Караев... in pro.algorithms
Mikola Summer Duck
Делать копию пула каждый раз когда хочешь его изменить?
я ж говорю - модификации редкие, чтение частое
источник