|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp бабушкин зайчик PetroNotC Sharp, потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу а это неприемлемо, т.к. вектор большой. Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема. Я тестил. Примерно при 10000 элементов и более удаление произвольного элемента из вектора работает медленнее чем удаление из std::map. Что собственно не удивительно, т.к. надо все последующие элементы сдвинуть. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 11:36 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
бабушкин зайчик PetroNotC Sharp, проблема всегда была одна - смещение ячеек влево. Ну и скорость тут тоже участвует. mayton А какой длины будет твой вектор (в среднем) ? миллионы так ещё и мультипоточность нельзя ждать, пока он там раздуплится А с полным копированием массива при переполнении как собрались бороться? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 11:37 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
petrav А с полным копированием массива при переполнении как собрались бороться? по ночам функция (это всё в демоне) будет чекать определённый порог, по его достижении увеличивать вектор (щас навскидку придумал) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 11:43 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
бабушкин зайчик, Миллионы в оперативке? Зачем? Скажите тогда миллиарды. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 11:55 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
бабушкин зайчик, >так ещё и мультипоточность =добавьте транзакционность. Вы забыли! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 11:58 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, не забыл. Но это оффтоп. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 11:59 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
бабушкин зайчик PetroNotC Sharp, не забыл. Но это оффтоп. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 12:05 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
кстати, о транзакционности... а как будет действовать C++ в такой ситуации: v1, v2, v3 ф-я сначала меняет v1, потом v2, потом v3 допустим ф-ю вызвали одновременно в двух потоках допустим они полезут в одну ячейку памяти очевидно одна ф-я окажется на X ns раньше, перезапишет ячейку в памяти для v1, потом пойдёт перезаписывать для v2, v3 какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 12:27 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
бабушкин зайчик PetroNotC Sharp, проблема всегда была одна - смещение ячеек влево. Ну и скорость тут тоже участвует. mayton А какой длины будет твой вектор (в среднем) ? миллионы так ещё и мультипоточность нельзя ждать, пока он там раздуплится Я вот не пойму. В 1 посту тебя можно было градуировать как С++ junior. Дальше ты затащил сложную тему. Тему кешей. И что нам делать дальше? Ты хоть обозначь честно свой левел чтоб понять как разговаривать? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 12:37 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
mayton, много теории, мало опыта (в C++, в остальном много) - так градуируй ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 12:42 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
бабушкин зайчиккакой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1? 50 на 50. Именно поэтому не надо обращаться к глобальных объектам без синхронизации. Используй уже названный std::optional и не выпендривайся. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 12:48 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
бабушкин зайчик кстати, о транзакционности... а как будет действовать C++ в такой ситуации: v1, v2, v3 ф-я сначала меняет v1, потом v2, потом v3 допустим ф-ю вызвали одновременно в двух потоках допустим они полезут в одну ячейку памяти очевидно одна ф-я окажется на X ns раньше, перезапишет ячейку в памяти для v1, потом пойдёт перезаписывать для v2, v3 какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1? Обходится без блокирования. А лочить и ждать.. Много ума не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 12:53 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
бабушкин зайчик petrav А с полным копированием массива при переполнении как собрались бороться? по ночам функция (это всё в демоне) будет чекать определённый порог, по его достижении увеличивать вектор (щас навскидку придумал) Это похоже на троллинг специалистов. Ты сразу выложи все техническое задание что ты придумал. Иначе мы тут будем ломать головы и ты, как-бы издеваясь подкидывать новые условия которые отменяют предыдущие архитектуры. По поводу атомарности. Бери моё первое предложение по age < 0 и используй. Для Intel архитектуры чтение DWORD чисел, выровненных по границе того-же DWORD должно быть атомарным. Булевое свойство и вертикальный массив - выкинь. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 12:53 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
mayton, Да. Троллинг. Нечем заняться челу. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 12:54 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
mayton По поводу атомарности. Бери моё первое предложение по age < 0 и используй. Для Intel архитектуры чтение DWORD чисел, выровненных по границе того-же DWORD должно быть атомарным. Булевое свойство и вертикальный массив - выкинь. Чтение и запись, да будут атомарными, но в общем логика программы построенная на этой атомарности не будет потокобезопасной. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 12:58 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
бабушкин зайчик кстати, о транзакционности... а как будет действовать C++ в такой ситуации: v1, v2, v3 ф-я сначала меняет v1, потом v2, потом v3 допустим ф-ю вызвали одновременно в двух потоках допустим они полезут в одну ячейку памяти очевидно одна ф-я окажется на X ns раньше, перезапишет ячейку в памяти для v1, потом пойдёт перезаписывать для v2, v3 какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1? Запись может произойти в любом порядке. Никаких ожиданий не будет, каждое ядро пишет в свой кэш и дальше работает. А в каком порядке дальше кэши ядер запишутся в память никто не скажет. Если тебе нужна транзакция, то обеспечивай ее явно. Читай про std::mutex ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 13:01 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
petrav mayton По поводу атомарности. Бери моё первое предложение по age < 0 и используй. Для Intel архитектуры чтение DWORD чисел, выровненных по границе того-же DWORD должно быть атомарным. Булевое свойство и вертикальный массив - выкинь. Чтение и запись, да будут атомарными, но в общем логика программы построенная на этой атомарности не будет потокобезопасной. Это просто старт дискуссии. Пускай он расскажет что потоки делают. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 13:02 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
бабушкин зайчик кстати, о транзакционности... а как будет действовать C++ в такой ситуации: v1, v2, v3 ф-я сначала меняет v1, потом v2, потом v3 допустим ф-ю вызвали одновременно в двух потоках допустим они полезут в одну ячейку памяти очевидно одна ф-я окажется на X ns раньше, перезапишет ячейку в памяти для v1, потом пойдёт перезаписывать для v2, v3 какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1? так, ладно, тогда как вам такое решение: потоки порождаются во время внешнего вызова, дёргают какую-то ф-ю (она может другие ф-и позвать) и исчезают тогда если сразу при возникновении вызова сделать mutex на весь поток - оптимальный вариант? только вот вектор с данными лежит отдельно... для удобства его можно принять за БД, к которой все подключаются. И лочить весь вектор не вариант, там только одна ячейка нужна для потока... А другой поток может в другую ячейку писать. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 13:09 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
бабушкин зайчик так, ладно, тогда как вам такое решение: потоки порождаются во время внешнего вызова, дёргают какую-то ф-ю (она может другие ф-и позвать) и исчезают Тогда твоя прога 99% времени будет занята созданием потоков, т.к. это далеко не быстро происходит. бабушкин зайчик тогда если сразу при возникновении вызова сделать mutex на весь поток - оптимальный вариант? только вот вектор с данными лежит отдельно... для удобства его можно принять за БД, к которой все подключаются. И лочить весь вектор не вариант, там только одна ячейка нужна для потока... А другой поток может в другую ячейку писать. Ты бы определился для начала одна ячейка в транзакции меняется или больше. Это принципиальный момент, если одна тогда можно использовать std::atomic без мьютекса. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 13:15 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
Dima T Тогда твоя прога 99% времени будет занята созданием потоков, т.к. это далеко не быстро происходит. пардон, неправильно выразился потоки то постоянные но вот приходит вызов и запускается ф-я, вот её можно залочить. Dima T Ты бы определился для начала одна ячейка в транзакции меняется или больше. Это принципиальный момент, если одна тогда можно использовать std::atomic без мьютекса. ну скажем в одном векторе одну ячейку но векторов может быть несколько ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 13:21 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
Dima T Ты бы определился для начала одна ячейка в транзакции меняется или больше. Это принципиальный момент, если одна тогда можно использовать std::atomic без мьютекса. std::atomic поможет только в простейших алгоритмах. Типа инкрементации элементов вектора. Чуть сложнее и снова всё поплывёт в плане потокобезопасности. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 13:28 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
бабушкин зайчик Dima T Тогда твоя прога 99% времени будет занята созданием потоков, т.к. это далеко не быстро происходит. пардон, неправильно выразился потоки то постоянные но вот приходит вызов и запускается ф-я, вот её можно залочить. Ничего не понял. бабушкин зайчик Dima T Ты бы определился для начала одна ячейка в транзакции меняется или больше. Это принципиальный момент, если одна тогда можно использовать std::atomic без мьютекса. ну скажем в одном векторе одну ячейку но векторов может быть несколько Тогда std::atomic не подходит. Можешь сделать не один мьютекс, а вектор с мьютексами, т.е. по одному на каждый набор. Или можно чуть соптимизировать, по одному мьютексу на несколько наборов, например 32. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 13:31 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
Если задача бъется на части - то можно сделать несколько массивов. По количеству тредов. Идеальный параллелизм. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 13:33 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
Всю прелесть и разбросанность многопоточных граблей можно ощутить только наступив на них. Пусть делает как хочет, опыт придёт как "сын ошибок трудных". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 13:36 |
|
как обнулить ячеку вектора (не удаляя)?
|
|||
---|---|---|---|
#18+
Dima T Ничего не понял. ну вот приходит вызов с параметром 1 на него запускается ф-я эту ф-ю можно ведь залочить мьютексом? Как и всё что в ней запустится. Dima T Можешь сделать не один мьютекс, а вектор с мьютексами, т.е. по одному на каждый набор. Или можно чуть соптимизировать, по одному мьютексу на несколько наборов, например 32. я немного недопонял, что именно они залочат? И что будет с ячейкой в векторе (отдельно стоящем и НЕ залоченном), куда полезут 2 потока в одну ячейку? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 13:41 |
|
|
start [/forum/topic.php?fid=57&msg=40059755&tid=2017237]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
others: | 248ms |
total: | 396ms |
0 / 0 |