powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / как обнулить ячеку вектора (не удаляя)?
146 сообщений из 146, показаны все 6 страниц
как обнулить ячеку вектора (не удаляя)?
    #40059614
Код: plaintext
1.
2.
3.
4.
5.
6.
struct A{
  int age;
  bool empty;
};

vector<A> v = {{5},{6},{9}};


я смог придумать только флаг empty, чтобы по нему смотреть - пустая это ячейка или нет
а может можно как-то null воткнуть в позицию v[1]?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059617
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку age обычно не бывает отрицательным - то можно договориться что если он равен -1 то это считается как null.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059627
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
Бывает что доп поле как раз технически красивее.
Преждевременная оптимизация зло.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059634
PetroNotC Sharp
Преждевременная оптимизация

ну это не она... Это проектирование архитектуры. Если её неправильно спроектировать, потом всё переделывать.
меня больше интересует, а есть ли вообще иной способ и на сколько этот прекрасен?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059636
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик

я смог придумать только флаг empty, чтобы по нему смотреть - пустая это ячейка или нет
а может можно как-то null воткнуть в позицию v[1]?

Попробуйте std::optional.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059637
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,

Если структуры большие, можно в векторе хранить std::unique_ptr<A> и вкорячивать nullptr.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059655
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
Да. Я именно про архитектуру.
Она начинается с вопроса: "зачем хранить дырки в списке".
Но вы вправе не обсуждать. Ваше право.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059656
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059663
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.

Есть еще альтернативный подход. Называется вертикальные массивы.

Просто создаёшь два вектора.

Код: plaintext
1.
2.
vector<int> ages;
vector<boolean> isEmpty;



данные хранятся физически не консолидировано. Но логически - они связны по индексу элемента.

Эта структура будет экономнее чем вериант с struct A {..}
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059665
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.
неужели вектор не оптимизирован для этого? Дай цифры!
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059666
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Да. Сам два вектора делал часто).
И еще есть 1500 вариантов оптимизации скорости в угоду.... жертвы
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059668
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,

>на место удалённых
Странная фраз. Что ты назвал местом? Бери другой список без мест или с местами заранее. Сортированный или нет......
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059670
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
бабушкин зайчик
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.

Есть еще альтернативный подход. Называется вертикальные массивы.

Просто создаёшь два вектора.

Код: plaintext
1.
2.
vector<int> ages;
vector<boolean> isEmpty;



данные хранятся физически не консолидировано. Но логически - они связны по индексу элемента.

Эта структура будет экономнее чем вериант с struct A {..}

Это, наверное, хорошо только в случае необходимости очень серьёзной и очень специфической
оптимизации. Но до этого придётся отказаться от std::vector и переходить на Си.

В остальных случаях ваш вариант ужасен.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059672
да, кэш такое не одобрит
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059673
PetroNotC Sharp
неужели вектор не оптимизирован для этого? Дай цифры!

нету цифр.
А как его оптимизируешь то? Адреса памяти в массиве идут подряд непрерывно.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059674
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
Тест на цифры делать пол часа.
Иначе как ты докажешь что задание выполнено?))
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059676
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
да, кэш такое не одобрит

Уж коли мы заговорили о кешах. Я-бы в первую очередь не одобрил структуру данных "с дырками внутри".
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059678
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
PetroNotC Sharp
неужели вектор не оптимизирован для этого? Дай цифры!

нету цифр.
А как его оптимизируешь то? Адреса памяти в массиве идут подряд непрерывно.
счас же умные указатели. Где там они физически тебе недоступно. Не?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059680
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,
У вас два слово "очень" и одно слово "ужасно". Это не инженерно)
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059681
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Преждевременная оптимизация без целей и цифр. (((
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059683
mayton
бабушкин зайчик
да, кэш такое не одобрит

Уж коли мы заговорили о кешах. Я-бы в первую очередь не одобрил структуру данных "с дырками внутри".

это вектор с дырками внутри, а не структура
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059684
PetroNotC Sharp
бабушкин зайчик
пропущено...

нету цифр.
А как его оптимизируешь то? Адреса памяти в массиве идут подряд непрерывно.
счас же умные указатели. Где там они физически тебе недоступно. Не?

не знаю. Вообще это что-то уже сродни листу... Там от балды ячейки в массив складываются, а не подряд.
В любом случае, МНЕ не подходит смещение индексов влево. Они должны оставаться теми же.
т.е. в ячейке 152 всегда должна быть та же самая структура с теми же самыми данными.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059694
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
mayton
пропущено...

Уж коли мы заговорили о кешах. Я-бы в первую очередь не одобрил структуру данных "с дырками внутри".

это вектор с дырками внутри, а не структура

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

>МНЕ не подходит смещение индексов влево
Сначала скорость мешала. Теперь направление)))
Короче, прогер сам себе задачи ставит. Бывает.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059698
PetroNotC Sharp,
проблема всегда была одна - смещение ячеек влево. Ну и скорость тут тоже участвует.

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

миллионы
так ещё и мультипоточность
нельзя ждать, пока он там раздуплится
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #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
как обнулить ячеку вектора (не удаляя)?
    #40059772
Dimitry Sibiryakov
Всю прелесть и разбросанность многопоточных граблей можно ощутить только наступив на них.
Пусть делает как хочет, опыт придёт как "сын ошибок трудных".

а можно не надо? Хотелось бы в теории прояснить всё, а не в продакшене.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059773
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчика можно не надо?

"Надо, Федя, надо."
Теория тут как собаке пятая нога.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059775
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
Какой продакшен без ТЗ?
Смешно.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059777
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Код: plaintext
1.
2.
3.
4.
5.
6.
struct A{
  int age;
  bool empty;
};

vector<A> v = {{5},{6},{9}};


я смог придумать только флаг empty, чтобы по нему смотреть - пустая это ячейка или нет
а может можно как-то null воткнуть в позицию v[1]?

"пустая это ячейка или нет" - такая формулировка автором трактуется как именно -
1) ячейка может не существовать - тогда она какая? отсутствующая или пустая?
2) для проверки на пустоту ячейка должна существовать и свойство пустоты - признак ячейки или функция контейнера?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059778
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dima T
Ничего не понял.

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

Лочится не код, а данные к которым он обращается. Например залочил ты функцию f1(), которая работает с ячейкой A, другие потоки не смогут f1() выполнить пока этот не доработает, но если есть f2() которая тоже работает с ячейкой A, то нет никакой пользы от блокировки f1()

бабушкин зайчик
Dima T
Можешь сделать не один мьютекс, а вектор с мьютексами, т.е. по одному на каждый набор. Или можно чуть соптимизировать, по одному мьютексу на несколько наборов, например 32.

я немного недопонял, что именно они залочат? И что будет с ячейкой в векторе (отдельно стоящем и НЕ залоченном), куда полезут 2 потока?

Никто не полезет в незалоченные.
Я так понимаю у тебя несколько векторов и ты работаешь с элементами с одинаковым индексом: v1[i], v2[i], v3[i], где i не меняется. Делаешь еще один вектор мутексов и лочишь vm[i].
Т.к. i у тебя может быть миллион, а миллион мутексов это многовато, поэтому vm можно уменьшить в N раз и для блокировки использовать vm[i/N]. Тогда на каждые N ячеек будет общий мутекс.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059781
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЛочится не код, а данные к которым он обращается.

Нет, технически таки лочится кусок кода от параллельного выполнения. Просто обычно
вменяемые программисты в этом куске кода пишут обращение к данным и таким способом
получают лок обращения данных (или, короче, лок данных). Но нубов лучше не путать. Они же
теорию хотят.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059782
Dimitry Sibiryakov
бабушкин зайчика можно не надо?

"Надо, Федя, надо."
Теория тут как собаке пятая нога.
запаришься отлавливать такие баги потом
ещё найди их сначала... где там цифра стоит 1, когда должна была быть 2, а ты понятия не имеешь, что должно было быть
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059783
Dima T
но если есть f2() которая тоже работает с ячейкой A, то нет никакой пользы от блокировки f1()

это именно мой случай
а что делать?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059784
Dima T
Я так понимаю у тебя несколько векторов и ты работаешь с элементами с одинаковым индексом: v1[i], v2[i], v3[i],

нет. Индексы всегда произвольные. НО есть шанс, что оба потока залезут в одинаковый v1[i]
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059785
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dima T
но если есть f2() которая тоже работает с ячейкой A, то нет никакой пользы от блокировки f1()

это именно мой случай
а что делать?

Читать написанное до конца 22304417
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059787
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dima T
Я так понимаю у тебя несколько векторов и ты работаешь с элементами с одинаковым индексом: v1[i], v2[i], v3[i],

нет. Индексы всегда произвольные. НО есть шанс, что оба потока залезут в одинаковый v1[i]

Один поток работает только с одним конкретным i или с разными? Т.е. {v1[5], v2[5], v3[5]} или {v1[4], v2[7], v3[6]} ? Если первое, то мутекс как я писал 22304417
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059788
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется что поиск свободных дырок в массиве (задачка o(n) асимптоматичная) - нивелирует вообще все выгоды
которые автор хочет получить от мнимых оптимизаций и кешей и потоков. Тут по смыслу больше не vector подходит а set.

Но это моё частное мнение и если автор хочет - ну пускай делает пробы с o(n) по массиву-миллионнику.

P.S. Scientia potentia est.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059789
Dimitry Sibiryakov
Dima TЛочится не код, а данные к которым он обращается.

Нет, технически таки лочится кусок кода от параллельного выполнения. Просто обычно
вменяемые программисты в этом куске кода пишут обращение к данным и таким способом
получают лок обращения данных (или, короче, лок данных). Но нубов лучше не путать. Они же
теорию хотят.
так я же так и хочу - внутри вызываемой ф-и делается запись в вектор, а ф-я лочится
или это другое?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059791
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dima T
но если есть f2() которая тоже работает с ячейкой A, то нет никакой пользы от блокировки f1()

это именно мой случай
а что делать?
писать код в котором нет борьбы 100 юзверей за одну ячейку памяти\ресурс/ложку/HDD.
https://ru.m.wikipedia.org/wiki/Параллельные_вычисления
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059792
mayton
Мне кажется что поиск свободных дырок в массиве (задачка o(n) асимптоматичная) - нивелирует вообще все выгоды
которые автор хочет получить от мнимых оптимизаций и кешей и потоков. Тут по смыслу больше не vector подходит а set.

Но это моё частное мнение и если автор хочет - ну пускай делает пробы с o(n) по массиву-миллионнику.

P.S. Scientia potentia est.

а не надо искать, надо вектор дырок держать
Dima T
бабушкин зайчик
пропущено...

нет. Индексы всегда произвольные. НО есть шанс, что оба потока залезут в одинаковый v1[i]

Один поток работает только с одним конкретным i или с разными? Т.е. {v1[5], v2[5], v3[5]} или {v1[4], v2[7], v3[6]} ? Если первое, то мутекс как я писал 22304417

каждый поток может залезть в v1[1] ИЛИ v1[2] ИЛИ vN[M] - в любой
НО всегда есть шанс, что оба залезут в одну ячейку
и такой баг потом хер поймаешь
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059794
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T

Никто не полезет в незалоченные.
Я так понимаю у тебя несколько векторов и ты работаешь с элементами с одинаковым индексом: v1[i], v2[i], v3[i], где i не меняется. Делаешь еще один вектор мутексов и лочишь vm[i].
Т.к. i у тебя может быть миллион, а миллион мутексов это многовато, поэтому vm можно уменьшить в N раз и для блокировки использовать vm[i/N]. Тогда на каждые N ячеек будет общий мутекс.

Не сработает, потому что в задаче N не константно и может увеличиваться. Всё равно придётся блокировать доступ ко всему массиву.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059795
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчикзапаришься отлавливать такие баги потом

Вот именно поэтому-то "опыт - сын ошибок трудных ". Отловишь пару и враз получишь
левель ап.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059796
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dimitry Sibiryakov
пропущено...

Нет, технически таки лочится кусок кода от параллельного выполнения. Просто обычно
вменяемые программисты в этом куске кода пишут обращение к данным и таким способом
получают лок обращения данных (или, короче, лок данных). Но нубов лучше не путать. Они же
теорию хотят.

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

Нет, технически таки лочится кусок кода от параллельного выполнения. Просто обычно
вменяемые программисты в этом куске кода пишут обращение к данным и таким способом
получают лок обращения данных (или, короче, лок данных). Но нубов лучше не путать. Они же
теорию хотят.

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

Так это выглядит в простейшем случае
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
std::vector<int> v;
std::mutex mtx; 
...
void f1() {
  ...
  {
    std::unique_lock<std::mutex> lck (mtx); // Блокировка
    // работа с v
   } // снятие блокировки
   ...
}

void f2() {
  ...
  {
    std::unique_lock<std::mutex> lck (mtx); // Блокировка
    // работа с v
   } // снятие блокировки
   ...
}
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059799
бабушкин зайчик
так я же так и хочу - внутри вызываемой ф-и делается запись в вектор, а ф-я лочится
или это другое?

вот только Dima T говорит, что это не поможет
и я с ним согласен, если сами данные не лочатся
Dima T
Так это выглядит в простейшем случае

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

вот только Dima T говорит, что это не поможет
и я с ним согласен, если сами данные не лочатся
ни разу блокировок не писал. Лочится кусок кода.. Второй поток не исполнит ЭТОТ КУСОК
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059801
PetroNotC Sharp
ни разу блокировок не писал. Лочится кусок кода.. Второй поток не исполнит ЭТОТ КУСОК

ну вот, я про тоже, не подходит это
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059804
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
PetroNotC Sharp
ни разу блокировок не писал. Лочится кусок кода.. Второй поток не исполнит ЭТОТ КУСОК

ну вот, я про тоже, не подходит это
куда не подходит?
ТЗ где?)))
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059805
PetroNotC Sharp
ТЗ где?)))

править вектор в несколько потоков БЕЗ data race и sms
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059806
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
Заполнил вектор на миллион - отдал потоку.
Заполнил второй - отдал второму потоку.
НИЧЕГО НЕ ЛОЧИМ
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059807
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
PetroNotC Sharp
ТЗ где?)))

править вектор в несколько потоков, и чтобы всё чётко
постановщика тебе надо грамотного
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059808
PetroNotC Sharp
бабушкин зайчик,
Заполнил вектор на миллион - отдал потоку.
Заполнил второй - отдал второму потоку.
НИЧЕГО НЕ ЛОЧИМ

он правится потоками бесконечное кол-во раз по одной ячейке за раз
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059810
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
mayton
Мне кажется что поиск свободных дырок в массиве (задачка o(n) асимптоматичная) - нивелирует вообще все выгоды
которые автор хочет получить от мнимых оптимизаций и кешей и потоков. Тут по смыслу больше не vector подходит а set.

Но это моё частное мнение и если автор хочет - ну пускай делает пробы с o(n) по массиву-миллионнику.

P.S. Scientia potentia est.

а не надо искать, надо вектор дырок держать

Еще один вектор где лежат одни дырки?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059811
mayton
Еще один вектор где лежат одни дырки?

адреса дырок
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059812
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
PetroNotC Sharp
бабушкин зайчик,
Заполнил вектор на миллион - отдал потоку.
Заполнил второй - отдал второму потоку.
НИЧЕГО НЕ ЛОЧИМ

он заполняется потоками
смешно. Чтобы опять с одной миски все ели?)))))
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059813
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dima T
Один поток работает только с одним конкретным i или с разными? Т.е. {v1[5], v2[5], v3[5]} или {v1[4], v2[7], v3[6]} ? Если первое, то мутекс как я писал 22304417

каждый поток может залезть в v1[1] ИЛИ v1[2] ИЛИ vN[M] - в любой
НО всегда есть шанс, что оба залезут в одну ячейку
и такой баг потом хер поймаешь

Начни с простого - один мутекс на всех, код будет как я выше показал 22304455 Только оптимизируй код так чтобы сначала подготовить нужные данные, затем блокировка, быстро прочитать/записать и снять блокировку.
Будет тормозить - тогда будешь дальше усложнять работу с блокировками. К тому времени немного опыта добавится.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059814
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
mayton
Еще один вектор где лежат одни дырки?

адреса дырок

А как менеджерить этот вектор адресов дырок? И как его блокировать? Он ведь тоже будет играть по правилам
твоей мультипоточки и ему точно также нужны будут мутексы или критические секции.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059815
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нравится дизайн)))
Тарелок на столе нет.
Все потоки едоки варят кастрюлю супа.
Потом как сварили, начинают есть все из одной.
Толкаясь и матерясь. Почему никто в очередь не ставит строго по одному.
))
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059817
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
бабушкин зайчик
пропущено...

адреса дырок

А как менеджерить этот вектор адресов дырок? И как его блокировать? Он ведь тоже будет играть по правилам
твоей мультипоточки и ему точно также нужны будут мутексы или критические секции.

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

А как менеджерить этот вектор адресов дырок? И как его блокировать? Он ведь тоже будет играть по правилам
твоей мультипоточки и ему точно также нужны будут мутексы или критические секции.

Кстати, если у автора есть массив дырок, то не очень понятен его первый пост - где он предлагал вводить булеву
переменную в каждую ячейку - признак того, что ячейка пустая. Ну а как началась многопоточность то ваще.

Одно другому не мешает: флаг пустоты нужен при проверке когда обращаешься к конкретной ячейке, а список индексов пустых для добавления новых, иначе перебор всего массива в поисках пустой.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059821
Dima T
бабушкин зайчик
пропущено...

каждый поток может залезть в v1[1] ИЛИ v1[2] ИЛИ vN[M] - в любой
НО всегда есть шанс, что оба залезут в одну ячейку
и такой баг потом хер поймаешь

Начни с простого - один мутекс на всех, код будет как я выше показал 22304455 Только оптимизируй код так чтобы сначала подготовить нужные данные, затем блокировка, быстро прочитать/записать и снять блокировку.
Будет тормозить - тогда будешь дальше усложнять работу с блокировками. К тому времени немного опыта добавится.

Я вот честно не вижу смысла в мутексе вообще...
может опыта конечно мало, но он очевидно НЕ залочит сами данные, а без этого совершенно накласть на всё остальное.
А вот как обеспечить НЕвозможность записать в одну ячейку - вопрос остаётся открытым...
вешать где-то флаг, что эта ячейка занята и чекать его каждый раз?
это на сколько же %% похерит производительность?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059822
mayton
бабушкин зайчик
пропущено...

адреса дырок

А как менеджерить этот вектор адресов дырок? И как его блокировать? Он ведь тоже будет играть по правилам
твоей мультипоточки и ему точно также нужны будут мутексы или критические секции.

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

Вообще-то для этих целей мутекс используют обычно.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059824
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
А ты слышал что оракл не блокировочник а сиквел блокировочник?
Никто ведь не помер.
Узко вопросы задаешь.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059826
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
mayton
пропущено...

А как менеджерить этот вектор адресов дырок? И как его блокировать? Он ведь тоже будет играть по правилам
твоей мультипоточки и ему точно также нужны будут мутексы или критические секции.

ты меня такими вопросами доведёшь до белого колена, плюну на всё и сделаю в один поток

Достаточно добавить отдельный мутекс для работы с этим массивом.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059827
Dima T
бабушкин зайчик
А вот как обеспечить НЕвозможность записать в одну ячейку - вопрос остаётся открытым...

Вообще-то для этих целей мутекс используют обычно.

а мой случай обычный?
В моём случае он заблочит ячейку? Потому что даже если он заблочит весь вектор, это уже НЕ подходит.
Но он вроде даже и вектор не лочит...
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059828
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик

это на сколько же %% похерит производительность?

Никто на это не ответит. Программирование - это практическая наука. А моделируемый объект (программа)
настолько сложен что мы не в состоянии создать формулу времени отклика. Напиши макет кода. Запускай.
И смотри как он работает.

Симуляция - это нормальный способ замера времени. Физики так делают часто. Симулируют потоки частиц
и смотрят потом как оно. Меряют.

Тоесть смысл моего поста в том что мы не можем предложить улучшение к пустоте. Нам нужен объект.

Кстати у меня к тебе настойчивая модераторская просьба - огласить полное ТЗ. Я понимаю
что для тебя это игровая задача и ты по ходу придумываешь брейнштомом всякие костыли
и подпорки в виде массивов индексов. Но мы просто топчемся на месте.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059829
Dima T
бабушкин зайчик
пропущено...

ты меня такими вопросами доведёшь до белого колена, плюну на всё и сделаю в один поток

Достаточно добавить отдельный мутекс для работы с этим массивом.

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

так огласил же - запись в вектор в несколько потоков БЕЗ data race/race condition
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059835
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчики все будут висеть и ждать его?

Нет, только те, кого ты заставишь это делать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059836
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
mayton
Кстати у меня к тебе настойчивая модераторская просьба - огласить полное ТЗ.

так огласил же - запись в вектор в несколько потоков БЕЗ data race/race condition
а где тут скорость с первой страницы. И где Нужность дырок?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059837
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
petrav
пропущено...

Кстати, если у автора есть массив дырок, то не очень понятен его первый пост - где он предлагал вводить булеву
переменную в каждую ячейку - признак того, что ячейка пустая. Ну а как началась многопоточность то ваще.

Одно другому не мешает: флаг пустоты нужен при проверке когда обращаешься к конкретной ячейке, а список индексов пустых для добавления новых, иначе перебор всего массива в поисках пустой.

Ну если нам нужны операции со всем массивом, то да. Например, посчитать сумму всех не пустых полей.
Но это снова потребует блокировки всего массива вместе с массивом дырок, а не на уровне отдельных ячеек.

Кстати, если массив дырок и дырок много, то потребуется уже смещать влево массив дырок. А аффтар этага ни хател.

Короче, это ржачная тема.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059838
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС, тебя закроют.
Код гони с проблемой.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059839
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
mayton
Кстати у меня к тебе настойчивая модераторская просьба - огласить полное ТЗ.

так огласил же - запись в вектор в несколько потоков БЕЗ data race/race condition

Это-же не все. Дальше ты писал еще про "адреса дырок". Что с ними делать? Ты их уже отменяешь?

И еще надо-бы знать сколько будет потоков. Если их будет 100500 - тогда наверное лучше их ставить
в некую очердь команд. И надо знать (примерно) характер и род доступа к массиву. Если он - когерентный
- то мы можем шибко соптимизировать на близких адресах хотя-бы в пределах кеш-линий или страниц.
Если между потоками не нужен жесткий ордеринг команд - то мы можем переупорядочить поток команд
таким образом чтобы мы больше писали в кеш-линию и страницу чем рандомно. Так работали старые жесткие
диски (NCQ/TCQ). И вроде-бы никто не замечал логических ошибок чтения записи. Всё было прозрачно.
И вообще чем больше твой массив - тем больше надо думать об эффекте L2/L3.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059841
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя дырки можно класть в конец массива и брать только с конца массива.
Если нам не важна последовательность в результирующем массиве.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059843
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravКстати, если массив дырок и дырок много, то потребуется уже смещать влево массив дырок.

Массив дырок может быть, например, очередью. Или стэком.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059844
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,
У него было волшебное слово "место" в массиве.Это он индекс наверно)))
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059846
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Хотя дырки можно класть в конец массива и брать только с конца массива.
Если нам не важна последовательность в результирующем массиве.

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

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

Кстати, если массив дырок и дырок много, то потребуется уже смещать влево массив дырок.

Если для этого массива дырок сделать отдельный мутекс, то все можно будет делать.
petrav
А аффтар этага ни хател.

Он про другие массивы не хотел, а про этот даже не подумал. mayton его этим моментом обрадовал ))

ТС похоже даже в теории не представляет как писать для многопоточности.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059854
PetroNotC Sharp
Можно проще. Поток на вектор с дырками и поток на вектор без дырок. Два вектора он сам предложил.

нельзя. Они в одном потоке должны быть. Точнее дырки сами по себе, а потокИ к ним обращаются. Нельзя их в какой-то поток пихать.
Dima T
Он про другие массивы не хотел, а про этот даже не подумал.

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

stack в принципе решает эту проблему

stack тоже нельзя с нескольких потоков одновременно пользовать. queue тоже.

Все классы-контейнеры из std непотокобезопасные, поэтому при многопоточной работе с ними надо дополнительно прописывать синхронизацию доступа.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059860
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автору нужно написать прототип класса. Где будет два закрытых массива: значения и дырки.
Описать сигнатуру методов и требования к этим методам в плане потокобезопасности.

Тогда можно предметно говорить как реализовывать этот класс. Иначе толку не будет.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059868
так, а что если при каждой записи создавать очередь?
чаще то будет чтение идти, запись так то сильно пореже
но чтобы совсем исключить шанс data race, что если эту попытку записи класть в очередь как-то (я не знаю как ф-ю покласть в очередь - можно ли?)
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059872
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
Еще немного и врубишься что потокам надо создавать или нарезать задачи.
А не наоборот, городить потоки возле одной кастрюли
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059877
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
так, а что если при каждой записи создавать очередь?

Как ты себе это представляешь? Покажи как в коде это будет выглядеть.

Чего ты так мутексов испугался? Они быстро работают, а без них многопоточная работа невозможна.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059881
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
По правде говоря, без блокировок тоже можно работать. В веб даже рекомендуется.
Из двух зол выбрали меньшее.)
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059889
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Правда это для для java.
Но суть что код надо подстраивать под параллелизм.
Ибо компромиссы!
авторКомпромиссы
Стратегия высокого параллелизма реагирует на требования высокого параллелизма снижением охвата транзакции до уровня, минимально возможного в данной архитектуре. Это приводит к более быстрому завершению (фиксации или откату) транзакции, чем при использовании стратегии слоя API. Однако, как учит нас история хорошего корабля Vasa (см. Ресурсы), вы не можете иметь все и сразу. Жизнь состоит из компромиссов, и обработка транзакций – не исключение. Не можете же вы впрямь рассчитывать одновременно и на такой же уровень надежности обработки транзакций, что и в стратегии слоя API, и на максимальное количество параллельных обращений и максимальную пропускную способность при пиковых нагрузках.
http://www.k-press.ru/cs/2009/3/ts/ts.asp
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059890
Dima T
Как ты себе это представляешь? Покажи как в коде это будет выглядеть.

это я у общественности спрашиваю - как
Dima T
Чего ты так мутексов испугался? Они быстро работают, а без них многопоточная работа невозможна.

да не испугался, а не вижу смысла, если вектор висит особняком, а потоки лочить, то какой толк от мутексов?
есть толк от них? Залочил поток и другой тоже залочил, так они же всё равно в одну ячейку смогут записать, потому что она то НЕ залочена...
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059891
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
По правде говоря, без блокировок тоже можно работать. В веб даже рекомендуется.

В вэб-сервере каждый поток сам по себе работает и нет никаких данных разделяемых между разными потоками, нечего блокировать.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059894
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Dima T,
По правде говоря, без блокировок тоже можно работать. В веб даже рекомендуется.
Из двух зол выбрали меньшее.)

Ну... чисто технически Оракл тоже использует блокировки. На очень короткое время и не для
транзакций а для поддержания консистентности db_blocks (это такие 8К кусочки памяти) в области
buffer_pull когда конкурирующие SQL-процессы пишут и читают один и тот-же блок.

Как разрабатывать ПО вообще без блокировок - ХЗ. Есть для этого технология Акторов.
Но у нее есть свои проблемы. И свои сложности дизайна.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059896
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dima T
Как ты себе это представляешь? Покажи как в коде это будет выглядеть.

это я у общественности спрашиваю - как
Dima T
Чего ты так мутексов испугался? Они быстро работают, а без них многопоточная работа невозможна.

да не испугался, а не вижу смысла, если вектор висит особняком, а потоки лочить, то какой толк от мутексов?
есть толк от них? Залочил поток и другой тоже залочил, так они же всё равно в одну ячейку смогут записать, потому что она то НЕ залочена...

Каша у тебя в голове, не понимаешь как блокировки работают. Нельзя залочить ячейку, нет такой операции "залочить ячейку".
Я ссылки давал выше 22304501 , почитал? Почитай хотя бы статью на хабре.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059897
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
В веб потоки тоже ресурс. И очень даже дорогой.
У веб сервера их 10 штук примерно.
А юзверей пусть пол лимона.
ТС похоже свой сервер пишет)))))
Где ище миллион вектор?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059902
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Я же не о технических говорил.
Нельзя узко про одни блоки вещать.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059904
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты пишешь дескыть Оракл не использует блокировки. Я уточняю что в понимании ОС он их еще как использует.

Просто на уровне транзакций - другой подход. И другие блокировки.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059906
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Вообще, в веб параллельный доступ осуществляет субд..
Почему автор решил субд заново изобрести не знаю
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059907
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Ты пишешь дескыть Оракл не использует блокировки. Я уточняю что в понимании ОС он их еще как использует.

Просто на уровне транзакций - другой подход. И другие блокировки.
я написал он не блокировочник. Механизм другой! Без блоков!
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059908
Dima T
Я ссылки давал выше 22304501 , почитал? Почитай хотя бы статью на хабре.

обязательно прочитаю, но позже.
Так я и написал, что не залочится. Это то я понимаю. Я не понимаю, зачем мне мутекс в таком случае...
Надеюсь хабр даст ответ.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059910
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, есть же концепция "множество читателей - один писатель". Только я, за ненадобностью, не помню
как её реализовать на C++. Даже названия не помню. :(
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059913
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dima T
Я ссылки давал выше 22304501 , почитал? Почитай хотя бы статью на хабре.

обязательно прочитаю, но позже.
Так я и написал, что не залочится. Это то я понимаю. Я не понимаю, зачем мне мутекс в таком случае...
Надеюсь хабр даст ответ.

Метод в векторе Добавить сначала запишет объект а потом увеличит счетчик Count.
Если два потока сразу, то эти две строки пемешаются.
Райзе будет.
Так понятно?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059914
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще про fairness не говорили.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059915
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
Шо будет если строки перемешать?))))
Код: plaintext
1.
2.
3.
public void deleteLast(Vector list) {
    int lastIndex = list.size() - 1;
    list.remove(lastIndex);


Давай уж код начнем писать)))
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059923
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Самый простой способ Не блокирования это клонирование коллекции или ее куска.
Широко применяется. Нет никаких особых последствий.
И никаких мьютексов.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059925
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я предлагаю обсудить кто первый получит доступ к g_mutex после того как самый первый поток его отпускает.

Код: plaintext
1.
2.
3.
4.
5.
6.
{
   // in thread 1
   lock(g_mutex);
   // very long action
   unlock(g_mutex);
}




Код: plaintext
1.
2.
3.
4.
{
   // in thread 2
   lock(g_mutex);
}



Код: plaintext
1.
2.
3.
4.
{
   // in thread 3
   lock(g_mutex);
}
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059929
PetroNotC Sharp
бабушкин зайчик
пропущено...

обязательно прочитаю, но позже.
Так я и написал, что не залочится. Это то я понимаю. Я не понимаю, зачем мне мутекс в таком случае...
Надеюсь хабр даст ответ.

Метод в векторе Добавить сначала запишет объект а потом увеличит счетчик Count.
Если два потока сразу, то эти две строки пемешаются.
Райзе будет.
Так понятно?

мне это не поможет, коли от кэша зависит, кто там первый встал того и тапки
мы имеем "старые данные" И "новые данные", т.е. один поток был раньше другого
а вот какие именно попадут в ячейку...

Я тут придумал вот чё: а шо если держать несколько ф-й, каждая из которых пишет в диапазон ячеек...
ф1 = 0-9999
ф2 = 10000-19999
(you got the idea)
И вот ИХ лочить?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059934
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик


Я тут придумал вот чё: а шо если держать несколько ф-й, каждая из которых пишет в диапазон ячеек...
ф1 = 0-9999
ф2 = 10000-19999
you got the idea.
И вот ИХ лочить?


Не надо их лочить. Это идеальный параллелизм. Shared Nothing. Только в конце работы тебе надо сделать ::join()
всех потоков чтобы убедится что корректировок массива уже не будет.

И не забывай про DWORD/ia32.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059937
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
В java лочатся все публичные методы для вектора с названием фабричного метода Collections.synchronizedXxxxx
Но есть и штук 30 других коллекций.
...
Если диапазон, то лочить не надо. Каждому потоку по тарелке
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059938
mayton
Это идеальный параллелизм. Shared Nothing.

ну вообще-то шанс то остаётся, что 2 потока залезут в одну ячейку
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059939
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС, идите в..... Qt!
Чем вы будете лисапед писать первый раз в жизни.
авторQtConcurrent имен предоставляет API - интерфейсы высокого уровня , которые делают возможным написание многопоточных программ без использования низкоуровневых поточных примитивов , таких как мьютексы, блокировки чтение-запись, условия ожидания или семафоры. Программы, написанные с помощью QtConcurrent, автоматически регулируют количество используемых потоков в соответствии с количеством доступных ядер процессора. Это означает, что приложения, написанные сегодня, будут продолжать масштабироваться при развертывании в многоядерных системах в будущем.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059940
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
mayton
Это идеальный параллелизм. Shared Nothing.

ну вообще-то шанс то остаётся, что 2 потока залезут в одну ячейку

Мне бабушка говорила
- Не ешь с пола.
- Одевай зимой шерстяные штаны.
- И выравнивай доступ к памяти по регистру.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059945
mayton
- И выравнивай доступ к памяти по регистру.

хм?
PetroNotC Sharp
ТС, идите в..... Qt!
Чем вы будете лисапед писать первый раз в жизни.
авторQtConcurrent имен предоставляет API - интерфейсы высокого уровня , которые делают возможным написание многопоточных программ без использования низкоуровневых поточных примитивов , таких как мьютексы, блокировки чтение-запись, условия ожидания или семафоры. Программы, написанные с помощью QtConcurrent, автоматически регулируют количество используемых потоков в соответствии с количеством доступных ядер процессора. Это означает, что приложения, написанные сегодня, будут продолжать масштабироваться при развертывании в многоядерных системах в будущем.

ВАУ! круто. вот оно, мечта!!1
жаль что говно (
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059948
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
))))
>жаль что говно (
Верю что транзакции в банке напишешь надежнее на тетрисе)))
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059950
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dima T
Я ссылки давал выше 22304501 , почитал? Почитай хотя бы статью на хабре.

обязательно прочитаю, но позже.
Так я и написал, что не залочится. Это то я понимаю. Я не понимаю, зачем мне мутекс в таком случае...
Надеюсь хабр даст ответ.

Потом и поговорим. О чем говорить если ты матчасть изучать не собираешься. Пиши однопоточно, иначе накосячишь.

И про кучу векторов ты неверно совет mayton`а расширил, он всего лишь предложил вынести флаг свободной ячейки в vector<bool>. Это не значит что если у тебя N полей надо N векторов.
Просто vector<bool> особенный, в нем 1 бит на значение, а тип bool - 1 байт. Экономия памяти в 8 раз.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059951
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Кстати, есть же концепция "множество читателей - один писатель". Только я, за ненадобностью, не помню
как её реализовать на C++. Даже названия не помню. :(

Есть такое, std::shared_mutex, но он тормоз, т.к. счетчик читателей меж кэшей всех потоков гоняется.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059958
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpГде ище миллион вектор?

Тут: https://www.sql.ru/forum/1326703/vector-na-trillion-obektov
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40060030
Dima T
Потом и поговорим. О чем говорить если ты матчасть изучать не собираешься.

не было такого. Просто нет смысла её читать, если сутки не спал. Всё равно перечитывать потом.
про vector<bool> говорят: "is a mess. DON't USE IT!"
а тут :
авторstd::vector<bool> behaves similarly to std::vector, but in order to be space efficient, it:
Does not necessarily store its elements as a contiguous array.
Exposes class std::vector<bool>::reference as a method of accessing individual bits. In particular, objects of this class are returned by operator[] by value.
Does not use std::allocator_traits::construct to construct bit values.
Does not guarantee that different elements in the same container can be modified concurrently by different threads.
уверен, что это хорошая мысль?

интересно, но там больше про БД
а вообще не мой случай
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40060036
вот мой случай
за исключением того, что там 2 потока работают с разными кусками вектора (0-10 и 10-20), поэтому проблемы нет
а у меня оба работают с 0-20 и проблема есть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Проблема в том, что mutex берется первым потоком, а второй поток не может работать, пока он не будет освобожден.

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

Вы можете переместить свою охрану в for-loop

for(int i=start; i<end; i++) {
  std::lock_guard<std::mutex> guard(mtx);
  vec[i] = i;
}

Это даст потокам возможность работать вместе над пройденным вектором.

BUT:

Вы должны принять во внимание, что несколько потоков не всегда дают производительность boost jut, потому что параллелизм != параллелизм .

Я бы ожидал, что это приложение таким образом будет на самом деле медленнее, чем однопоточная реализация, потому что следующее:
    Потоки блокируют друг друга с помощью mutex , поэтому одновременно работает только один поток
    Вы тратите время на переключение контекста между потоками

ИДЕЯ РЕШЕНИЯ:
Если вы хотите запустить его действительно параллельно, вам нужно заставить потоки работать с независимыми данными, а затем объединить результат.


у меня потоки нужны для чтения, а на запись операций в разы меньше
поэтому можно было бы либо лочить вектор просто (его ведь читать можно будет?), но это затраты, как выше описано
либо запись делать одним потоком (если можно одновременно в многопоточном приложении такое сделать?
По идее можно, ведь я могу внутри ф-и, которая вызывается на событии, сделать разделение на чтение/запись и параллелить только чтение...)
(ушёл читать хабр)
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40060044
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
автор Does not guarantee that different elements in the same container can be modified concurrently by different threads.

уверен, что это хорошая мысль?
От того что в описании вектора подобное не написано не означает что с ним можно работать многопоточно без синхронизации. Я об этом уже писал 22304542

Можно работать многопоточно без синхронизации только если разработчик явно об этом заявляет. Ключевое слово threadsafe (потокобезопасно). Например ConcurrentDictionary в C#.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40060046
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
>у меня потоки нужны для чтения, а на запись операций в разы меньше
= где обоснование что они нужны если кода нет и ты их не писал в жизни?
Вполне можно взять Фоновый Один поток и пусть работает тихо и незаметно.
Если одним писать и другим читать, то это и есть подводные камни.
6 страниц а ты до сих пор ничего не понял.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40060057
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня - есть стойкое убеждение, что подобного рода споры не имеют смысла без макета исходного кода.

Я закрываю этот топик.

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


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