powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / как обнулить ячеку вектора (не удаляя)?
25 сообщений из 146, страница 2 из 6
как обнулить ячеку вектора (не удаляя)?
    #40059701
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
бабушкин зайчик
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.
неужели вектор не оптимизирован для этого? Дай цифры!

Я тестил. Примерно при 10000 элементов и более удаление произвольного элемента из вектора работает медленнее чем удаление из std::map. Что собственно не удивительно, т.к. надо все последующие элементы сдвинуть.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059702
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
PetroNotC Sharp,
проблема всегда была одна - смещение ячеек влево. Ну и скорость тут тоже участвует.

mayton
А какой длины будет твой вектор (в среднем) ?

миллионы
так ещё и мультипоточность
нельзя ждать, пока он там раздуплится

А с полным копированием массива при переполнении как собрались бороться?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059707
petrav
А с полным копированием массива при переполнении как собрались бороться?

по ночам функция (это всё в демоне) будет чекать определённый порог, по его достижении увеличивать вектор
(щас навскидку придумал)
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059710
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
Миллионы в оперативке? Зачем?
Скажите тогда миллиарды.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059712
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,

>так ещё и мультипоточность
=добавьте транзакционность. Вы забыли!
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059713
PetroNotC Sharp,
не забыл. Но это оффтоп.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059718
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
PetroNotC Sharp,
не забыл. Но это оффтоп.
скучно. Оптимизируем тетрис кубики. А Маск на марс полетел)
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059727
кстати, о транзакционности...
а как будет действовать C++ в такой ситуации:
v1, v2, v3
ф-я сначала меняет v1, потом v2, потом v3
допустим ф-ю вызвали одновременно в двух потоках
допустим они полезут в одну ячейку памяти
очевидно одна ф-я окажется на X ns раньше, перезапишет ячейку в памяти для v1, потом пойдёт перезаписывать для v2, v3
какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059730
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
PetroNotC Sharp,
проблема всегда была одна - смещение ячеек влево. Ну и скорость тут тоже участвует.

mayton
А какой длины будет твой вектор (в среднем) ?

миллионы
так ещё и мультипоточность
нельзя ждать, пока он там раздуплится

Я вот не пойму. В 1 посту тебя можно было градуировать как С++ junior. Дальше ты затащил сложную тему.
Тему кешей. И что нам делать дальше? Ты хоть обозначь честно свой левел чтоб понять как разговаривать?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059736
mayton,
много теории, мало опыта (в C++, в остальном много) - так градуируй
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059740
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчиккакой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет
v2 раньше, чем ф-я1?

50 на 50. Именно поэтому не надо обращаться к глобальных объектам без синхронизации.

Используй уже названный std::optional и не выпендривайся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059743
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
кстати, о транзакционности...
а как будет действовать C++ в такой ситуации:
v1, v2, v3
ф-я сначала меняет v1, потом v2, потом v3
допустим ф-ю вызвали одновременно в двух потоках
допустим они полезут в одну ячейку памяти
очевидно одна ф-я окажется на X ns раньше, перезапишет ячейку в памяти для v1, потом пойдёт перезаписывать для v2, v3
какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1?
чудес не бывает. Надо архитектурой не позволять двум работам сталкиваться лбами.
Обходится без блокирования.
А лочить и ждать.. Много ума не надо.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059744
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
petrav
А с полным копированием массива при переполнении как собрались бороться?

по ночам функция (это всё в демоне) будет чекать определённый порог, по его достижении увеличивать вектор
(щас навскидку придумал)

Это похоже на троллинг специалистов. Ты сразу выложи все техническое задание что ты придумал. Иначе мы
тут будем ломать головы и ты, как-бы издеваясь подкидывать новые условия которые отменяют предыдущие
архитектуры.

По поводу атомарности. Бери моё первое предложение по age < 0 и используй. Для Intel архитектуры чтение
DWORD чисел, выровненных по границе того-же DWORD должно быть атомарным. Булевое свойство и вертикальный
массив - выкинь.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059746
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Да. Троллинг. Нечем заняться челу.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059747
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

По поводу атомарности. Бери моё первое предложение по age < 0 и используй. Для Intel архитектуры чтение
DWORD чисел, выровненных по границе того-же DWORD должно быть атомарным. Булевое свойство и вертикальный
массив - выкинь.

Чтение и запись, да будут атомарными, но в общем логика программы построенная на этой атомарности не будет потокобезопасной.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059748
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
кстати, о транзакционности...
а как будет действовать C++ в такой ситуации:
v1, v2, v3
ф-я сначала меняет v1, потом v2, потом v3
допустим ф-ю вызвали одновременно в двух потоках
допустим они полезут в одну ячейку памяти
очевидно одна ф-я окажется на X ns раньше, перезапишет ячейку в памяти для v1, потом пойдёт перезаписывать для v2, v3
какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1?

Запись может произойти в любом порядке. Никаких ожиданий не будет, каждое ядро пишет в свой кэш и дальше работает. А в каком порядке дальше кэши ядер запишутся в память никто не скажет.

Если тебе нужна транзакция, то обеспечивай ее явно. Читай про std::mutex
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059751
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
mayton

По поводу атомарности. Бери моё первое предложение по age < 0 и используй. Для Intel архитектуры чтение
DWORD чисел, выровненных по границе того-же DWORD должно быть атомарным. Булевое свойство и вертикальный
массив - выкинь.

Чтение и запись, да будут атомарными, но в общем логика программы построенная на этой атомарности не будет потокобезопасной.

Это просто старт дискуссии. Пускай он расскажет что потоки делают.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059752
бабушкин зайчик
кстати, о транзакционности...
а как будет действовать C++ в такой ситуации:
v1, v2, v3
ф-я сначала меняет v1, потом v2, потом v3
допустим ф-ю вызвали одновременно в двух потоках
допустим они полезут в одну ячейку памяти
очевидно одна ф-я окажется на X ns раньше, перезапишет ячейку в памяти для v1, потом пойдёт перезаписывать для v2, v3
какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1?

так, ладно, тогда как вам такое решение:
потоки порождаются во время внешнего вызова, дёргают какую-то ф-ю (она может другие ф-и позвать) и исчезают
тогда если сразу при возникновении вызова сделать mutex на весь поток - оптимальный вариант?
только вот вектор с данными лежит отдельно... для удобства его можно принять за БД, к которой все подключаются.
И лочить весь вектор не вариант, там только одна ячейка нужна для потока...
А другой поток может в другую ячейку писать.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059755
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
так, ладно, тогда как вам такое решение:
потоки порождаются во время внешнего вызова, дёргают какую-то ф-ю (она может другие ф-и позвать) и исчезают

Тогда твоя прога 99% времени будет занята созданием потоков, т.к. это далеко не быстро происходит.
бабушкин зайчик
тогда если сразу при возникновении вызова сделать mutex на весь поток - оптимальный вариант?
только вот вектор с данными лежит отдельно... для удобства его можно принять за БД, к которой все подключаются.
И лочить весь вектор не вариант, там только одна ячейка нужна для потока...
А другой поток может в другую ячейку писать.

Ты бы определился для начала одна ячейка в транзакции меняется или больше. Это принципиальный момент, если одна тогда можно использовать std::atomic без мьютекса.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059758
Dima T
Тогда твоя прога 99% времени будет занята созданием потоков, т.к. это далеко не быстро происходит.

пардон, неправильно выразился
потоки то постоянные
но вот приходит вызов и запускается ф-я, вот её можно залочить.

Dima T
Ты бы определился для начала одна ячейка в транзакции меняется или больше. Это принципиальный момент, если одна тогда можно использовать std::atomic без мьютекса.

ну скажем в одном векторе одну ячейку
но векторов может быть несколько
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059761
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T

Ты бы определился для начала одна ячейка в транзакции меняется или больше. Это принципиальный момент, если одна тогда можно использовать std::atomic без мьютекса.

std::atomic поможет только в простейших алгоритмах. Типа инкрементации элементов вектора.
Чуть сложнее и снова всё поплывёт в плане потокобезопасности.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059763
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dima T
Тогда твоя прога 99% времени будет занята созданием потоков, т.к. это далеко не быстро происходит.

пардон, неправильно выразился
потоки то постоянные
но вот приходит вызов и запускается ф-я, вот её можно залочить.

Ничего не понял.

бабушкин зайчик
Dima T
Ты бы определился для начала одна ячейка в транзакции меняется или больше. Это принципиальный момент, если одна тогда можно использовать std::atomic без мьютекса.

ну скажем в одном векторе одну ячейку
но векторов может быть несколько

Тогда std::atomic не подходит.
Можешь сделать не один мьютекс, а вектор с мьютексами, т.е. по одному на каждый набор. Или можно чуть соптимизировать, по одному мьютексу на несколько наборов, например 32.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059766
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если задача бъется на части - то можно сделать несколько массивов. По количеству тредов. Идеальный параллелизм.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059768
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всю прелесть и разбросанность многопоточных граблей можно ощутить только наступив на них.
Пусть делает как хочет, опыт придёт как "сын ошибок трудных".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059771
Dima T
Ничего не понял.

ну вот приходит вызов с параметром 1
на него запускается ф-я
эту ф-ю можно ведь залочить мьютексом? Как и всё что в ней запустится.
Dima T
Можешь сделать не один мьютекс, а вектор с мьютексами, т.е. по одному на каждый набор. Или можно чуть соптимизировать, по одному мьютексу на несколько наборов, например 32.

я немного недопонял, что именно они залочат? И что будет с ячейкой в векторе (отдельно стоящем и НЕ залоченном), куда полезут 2 потока в одну ячейку?
...
Рейтинг: 0 / 0
25 сообщений из 146, страница 2 из 6
Форумы / C++ [игнор отключен] [закрыт для гостей] / как обнулить ячеку вектора (не удаляя)?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]