Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4 5 6      [все]
 как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
struct A{
  int age;
  bool empty;
};

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

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

Сообщение было отредактировано: 5 апр 21, 06:17
5 апр 21, 06:20    [22304171]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Поскольку age обычно не бывает отрицательным - то можно договориться что если он равен -1 то это считается как null.
5 апр 21, 06:51    [22304174]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
Бывает что доп поле как раз технически красивее.
Преждевременная оптимизация зло.
5 апр 21, 07:49    [22304189]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp
Преждевременная оптимизация

ну это не она... Это проектирование архитектуры. Если её неправильно спроектировать, потом всё переделывать.
меня больше интересует, а есть ли вообще иной способ и на сколько этот прекрасен?

Сообщение было отредактировано: 5 апр 21, 09:31
5 апр 21, 09:36    [22304203]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
бабушкин зайчик

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

Попробуйте std::optional.
5 апр 21, 09:58    [22304212]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
бабушкин зайчик,

Если структуры большие, можно в векторе хранить std::unique_ptr<A> и вкорячивать nullptr.
5 апр 21, 10:00    [22304214]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
Да. Я именно про архитектуру.
Она начинается с вопроса: "зачем хранить дырки в списке".
Но вы вправе не обсуждать. Ваше право.
5 апр 21, 10:36    [22304241]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.
5 апр 21, 10:39    [22304242]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
бабушкин зайчик
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.

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

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

vector<int> ages;
vector<boolean> isEmpty;


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

Эта структура будет экономнее чем вериант с struct A {..}
5 апр 21, 10:45    [22304250]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.
неужели вектор не оптимизирован для этого? Дай цифры!
5 апр 21, 10:51    [22304254]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Да. Сам два вектора делал часто).
И еще есть 1500 вариантов оптимизации скорости в угоду.... жертвы
5 апр 21, 10:52    [22304256]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,

>на место удалённых
Странная фраз. Что ты назвал местом? Бери другой список без мест или с местами заранее. Сортированный или нет......
5 апр 21, 10:54    [22304260]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton
бабушкин зайчик
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.

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

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

vector<int> ages;
vector<boolean> isEmpty;


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

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

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

В остальных случаях ваш вариант ужасен.
5 апр 21, 11:05    [22304265]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
да, кэш такое не одобрит
5 апр 21, 11:07    [22304267]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp
неужели вектор не оптимизирован для этого? Дай цифры!

нету цифр.
А как его оптимизируешь то? Адреса памяти в массиве идут подряд непрерывно.
5 апр 21, 11:08    [22304268]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
Тест на цифры делать пол часа.
Иначе как ты докажешь что задание выполнено?))
5 апр 21, 11:11    [22304269]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
бабушкин зайчик
да, кэш такое не одобрит

Уж коли мы заговорили о кешах. Я-бы в первую очередь не одобрил структуру данных "с дырками внутри".
5 апр 21, 11:11    [22304271]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
PetroNotC Sharp
неужели вектор не оптимизирован для этого? Дай цифры!

нету цифр.
А как его оптимизируешь то? Адреса памяти в массиве идут подряд непрерывно.
счас же умные указатели. Где там они физически тебе недоступно. Не?
5 апр 21, 11:12    [22304273]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
У вас два слово "очень" и одно слово "ужасно". Это не инженерно)
5 апр 21, 11:14    [22304275]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Преждевременная оптимизация без целей и цифр. (((
5 апр 21, 11:15    [22304276]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
mayton
бабушкин зайчик
да, кэш такое не одобрит

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

это вектор с дырками внутри, а не структура
5 апр 21, 11:17    [22304279]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp
бабушкин зайчик
пропущено...

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

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

Сообщение было отредактировано: 5 апр 21, 11:13
5 апр 21, 11:19    [22304280]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
бабушкин зайчик
mayton
пропущено...

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

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

А какой длины будет твой вектор (в среднем) ?
5 апр 21, 11:25    [22304291]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,

>МНЕ не подходит смещение индексов влево
Сначала скорость мешала. Теперь направление)))
Короче, прогер сам себе задачи ставит. Бывает.
5 апр 21, 11:27    [22304293]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp,
проблема всегда была одна - смещение ячеек влево. Ну и скорость тут тоже участвует.

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

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

Сообщение было отредактировано: 5 апр 21, 11:27
5 апр 21, 11:35    [22304298]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
PetroNotC Sharp
бабушкин зайчик
PetroNotC Sharp,
потому что удаление ячейки влечёт за собой смещение всех последующих ячеек к началу
а это неприемлемо, т.к. вектор большой.
Кроме того, на место удалённых очень быстро будут записаны новые, так что это не проблема.
неужели вектор не оптимизирован для этого? Дай цифры!

Я тестил. Примерно при 10000 элементов и более удаление произвольного элемента из вектора работает медленнее чем удаление из std::map. Что собственно не удивительно, т.к. надо все последующие элементы сдвинуть.
5 апр 21, 11:36    [22304301]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
бабушкин зайчик
PetroNotC Sharp,
проблема всегда была одна - смещение ячеек влево. Ну и скорость тут тоже участвует.

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

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

А с полным копированием массива при переполнении как собрались бороться?
5 апр 21, 11:37    [22304302]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
petrav
А с полным копированием массива при переполнении как собрались бороться?

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

Сообщение было отредактировано: 5 апр 21, 11:39
5 апр 21, 11:43    [22304309]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
Миллионы в оперативке? Зачем?
Скажите тогда миллиарды.
5 апр 21, 11:55    [22304317]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,

>так ещё и мультипоточность
=добавьте транзакционность. Вы забыли!
5 апр 21, 11:58    [22304320]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp,
не забыл. Но это оффтоп.
5 апр 21, 11:59    [22304321]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
PetroNotC Sharp,
не забыл. Но это оффтоп.
скучно. Оптимизируем тетрис кубики. А Маск на марс полетел)
5 апр 21, 12:05    [22304328]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
кстати, о транзакционности...
а как будет действовать C++ в такой ситуации:
v1, v2, v3
ф-я сначала меняет v1, потом v2, потом v3
допустим ф-ю вызвали одновременно в двух потоках
допустим они полезут в одну ячейку памяти
очевидно одна ф-я окажется на X ns раньше, перезапишет ячейку в памяти для v1, потом пойдёт перезаписывать для v2, v3
какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1?
5 апр 21, 12:27    [22304343]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
бабушкин зайчик
PetroNotC Sharp,
проблема всегда была одна - смещение ячеек влево. Ну и скорость тут тоже участвует.

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

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

Я вот не пойму. В 1 посту тебя можно было градуировать как С++ junior. Дальше ты затащил сложную тему.
Тему кешей. И что нам делать дальше? Ты хоть обозначь честно свой левел чтоб понять как разговаривать?
5 апр 21, 12:37    [22304347]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
mayton,
много теории, мало опыта (в C++, в остальном много) - так градуируй

Сообщение было отредактировано: 5 апр 21, 12:34
5 апр 21, 12:42    [22304354]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

бабушкин зайчик
какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет
v2 раньше, чем ф-я1?

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

Используй уже названный std::optional и не выпендривайся.

Posted via ActualForum NNTP Server 1.5

5 апр 21, 12:48    [22304359]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
кстати, о транзакционности...
а как будет действовать C++ в такой ситуации:
v1, v2, v3
ф-я сначала меняет v1, потом v2, потом v3
допустим ф-ю вызвали одновременно в двух потоках
допустим они полезут в одну ячейку памяти
очевидно одна ф-я окажется на X ns раньше, перезапишет ячейку в памяти для v1, потом пойдёт перезаписывать для v2, v3
какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1?
чудес не бывает. Надо архитектурой не позволять двум работам сталкиваться лбами.
Обходится без блокирования.
А лочить и ждать.. Много ума не надо.
5 апр 21, 12:53    [22304365]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
бабушкин зайчик
petrav
А с полным копированием массива при переполнении как собрались бороться?

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

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

По поводу атомарности. Бери моё первое предложение по age < 0 и используй. Для Intel архитектуры чтение
DWORD чисел, выровненных по границе того-же DWORD должно быть атомарным. Булевое свойство и вертикальный
массив - выкинь.
5 апр 21, 12:53    [22304366]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Да. Троллинг. Нечем заняться челу.
5 апр 21, 12:54    [22304368]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton

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

Чтение и запись, да будут атомарными, но в общем логика программы построенная на этой атомарности не будет потокобезопасной.
5 апр 21, 12:58    [22304369]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
кстати, о транзакционности...
а как будет действовать C++ в такой ситуации:
v1, v2, v3
ф-я сначала меняет v1, потом v2, потом v3
допустим ф-ю вызвали одновременно в двух потоках
допустим они полезут в одну ячейку памяти
очевидно одна ф-я окажется на X ns раньше, перезапишет ячейку в памяти для v1, потом пойдёт перезаписывать для v2, v3
какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1?

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

Если тебе нужна транзакция, то обеспечивай ее явно. Читай про std::mutex
5 апр 21, 13:01    [22304371]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
petrav
mayton

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

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

Это просто старт дискуссии. Пускай он расскажет что потоки делают.
5 апр 21, 13:02    [22304375]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
бабушкин зайчик
кстати, о транзакционности...
а как будет действовать C++ в такой ситуации:
v1, v2, v3
ф-я сначала меняет v1, потом v2, потом v3
допустим ф-ю вызвали одновременно в двух потоках
допустим они полезут в одну ячейку памяти
очевидно одна ф-я окажется на X ns раньше, перезапишет ячейку в памяти для v1, потом пойдёт перезаписывать для v2, v3
какой шанс, что ф-я2, в ожидании освобождения ячейки из v1, каким-то образом перезапишет v2 раньше, чем ф-я1?

так, ладно, тогда как вам такое решение:
потоки порождаются во время внешнего вызова, дёргают какую-то ф-ю (она может другие ф-и позвать) и исчезают
тогда если сразу при возникновении вызова сделать mutex на весь поток - оптимальный вариант?
только вот вектор с данными лежит отдельно... для удобства его можно принять за БД, к которой все подключаются.
И лочить весь вектор не вариант, там только одна ячейка нужна для потока...
А другой поток может в другую ячейку писать.
5 апр 21, 13:09    [22304379]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
так, ладно, тогда как вам такое решение:
потоки порождаются во время внешнего вызова, дёргают какую-то ф-ю (она может другие ф-и позвать) и исчезают

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

Ты бы определился для начала одна ячейка в транзакции меняется или больше. Это принципиальный момент, если одна тогда можно использовать std::atomic без мьютекса.
5 апр 21, 13:15    [22304383]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dima T
Тогда твоя прога 99% времени будет занята созданием потоков, т.к. это далеко не быстро происходит.

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

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

ну скажем в одном векторе одну ячейку
но векторов может быть несколько
5 апр 21, 13:21    [22304388]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dima T

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

std::atomic поможет только в простейших алгоритмах. Типа инкрементации элементов вектора.
Чуть сложнее и снова всё поплывёт в плане потокобезопасности.
5 апр 21, 13:28    [22304391]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
Dima T
Тогда твоя прога 99% времени будет занята созданием потоков, т.к. это далеко не быстро происходит.

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

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

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

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

Тогда std::atomic не подходит.
Можешь сделать не один мьютекс, а вектор с мьютексами, т.е. по одному на каждый набор. Или можно чуть соптимизировать, по одному мьютексу на несколько наборов, например 32.
5 апр 21, 13:31    [22304394]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Если задача бъется на части - то можно сделать несколько массивов. По количеству тредов. Идеальный параллелизм.
5 апр 21, 13:33    [22304397]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Всю прелесть и разбросанность многопоточных граблей можно ощутить только наступив на них.
Пусть делает как хочет, опыт придёт как "сын ошибок трудных".

Posted via ActualForum NNTP Server 1.5

5 апр 21, 13:36    [22304400]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dima T
Ничего не понял.

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

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

Сообщение было отредактировано: 5 апр 21, 13:34
5 апр 21, 13:41    [22304404]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dimitry Sibiryakov
Всю прелесть и разбросанность многопоточных граблей можно ощутить только наступив на них.
Пусть делает как хочет, опыт придёт как "сын ошибок трудных".

а можно не надо? Хотелось бы в теории прояснить всё, а не в продакшене.
5 апр 21, 13:41    [22304405]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

бабушкин зайчик
а можно не надо?

"Надо, Федя, надо."
Теория тут как собаке пятая нога.

Posted via ActualForum NNTP Server 1.5

5 апр 21, 13:45    [22304407]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
Какой продакшен без ТЗ?
Смешно.
5 апр 21, 13:49    [22304412]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
ну я
Member

Откуда: Москва
Сообщений: 1255
бабушкин зайчик
struct A{
  int age;
  bool empty;
};

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

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

"пустая это ячейка или нет" - такая формулировка автором трактуется как именно -
1) ячейка может не существовать - тогда она какая? отсутствующая или пустая?
2) для проверки на пустоту ячейка должна существовать и свойство пустоты - признак ячейки или функция контейнера?
5 апр 21, 13:55    [22304416]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
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 ячеек будет общий мутекс.
5 апр 21, 13:55    [22304417]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Dima T
Лочится не код, а данные к которым он обращается.

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

Posted via ActualForum NNTP Server 1.5

5 апр 21, 14:02    [22304424]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dimitry Sibiryakov
бабушкин зайчик
а можно не надо?

"Надо, Федя, надо."
Теория тут как собаке пятая нога.

запаришься отлавливать такие баги потом
ещё найди их сначала... где там цифра стоит 1, когда должна была быть 2, а ты понятия не имеешь, что должно было быть

Сообщение было отредактировано: 5 апр 21, 14:02
5 апр 21, 14:06    [22304427]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dima T
но если есть f2() которая тоже работает с ячейкой A, то нет никакой пользы от блокировки f1()

это именно мой случай
а что делать?
5 апр 21, 14:07    [22304429]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dima T
Я так понимаю у тебя несколько векторов и ты работаешь с элементами с одинаковым индексом: v1[i], v2[i], v3[i],

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

Сообщение было отредактировано: 5 апр 21, 14:00
5 апр 21, 14:08    [22304430]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
Dima T
но если есть f2() которая тоже работает с ячейкой A, то нет никакой пользы от блокировки f1()

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

Читать написанное до конца 22304417
5 апр 21, 14:08    [22304432]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
Dima T
Я так понимаю у тебя несколько векторов и ты работаешь с элементами с одинаковым индексом: v1[i], v2[i], v3[i],

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

Один поток работает только с одним конкретным i или с разными? Т.е. {v1[5], v2[5], v3[5]} или {v1[4], v2[7], v3[6]} ? Если первое, то мутекс как я писал 22304417
5 апр 21, 14:11    [22304436]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Мне кажется что поиск свободных дырок в массиве (задачка o(n) асимптоматичная) - нивелирует вообще все выгоды
которые автор хочет получить от мнимых оптимизаций и кешей и потоков. Тут по смыслу больше не vector подходит а set.

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

P.S. Scientia potentia est.
5 апр 21, 14:12    [22304438]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dimitry Sibiryakov
Dima T
Лочится не код, а данные к которым он обращается.

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

так я же так и хочу - внутри вызываемой ф-и делается запись в вектор, а ф-я лочится
или это другое?
5 апр 21, 14:12    [22304439]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
Dima T
но если есть f2() которая тоже работает с ячейкой A, то нет никакой пользы от блокировки f1()

это именно мой случай
а что делать?
писать код в котором нет борьбы 100 юзверей за одну ячейку памяти\ресурс/ложку/HDD.
https://ru.m.wikipedia.org/wiki/Параллельные_вычисления
5 апр 21, 14:15    [22304445]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
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] - в любой
НО всегда есть шанс, что оба залезут в одну ячейку
и такой баг потом хер поймаешь
5 апр 21, 14:15    [22304448]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dima T

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

Не сработает, потому что в задаче N не константно и может увеличиваться. Всё равно придётся блокировать доступ ко всему массиву.
5 апр 21, 14:16    [22304450]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

бабушкин зайчик
запаришься отлавливать такие баги потом

Вот именно поэтому-то "опыт - сын ошибок трудных". Отловишь пару и враз получишь
левель ап.

Posted via ActualForum NNTP Server 1.5

5 апр 21, 14:17    [22304451]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
Dimitry Sibiryakov
пропущено...

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

так я же так и хочу - внутри вызываемой ф-и делается запись в вектор, а ф-я лочится
или это другое?
не пиши туда где читаешь и не читай во время еды (с)
5 апр 21, 14:17    [22304452]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
Dimitry Sibiryakov
пропущено...

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

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

Так это выглядит в простейшем случае
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
   } // снятие блокировки
   ...
}
5 апр 21, 14:18    [22304455]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

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

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

так а ячейка в v то залочится или нет?

Сообщение было отредактировано: 5 апр 21, 14:13
5 апр 21, 14:19    [22304459]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

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

вот только Dima T говорит, что это не поможет
и я с ним согласен, если сами данные не лочатся
ни разу блокировок не писал. Лочится кусок кода.. Второй поток не исполнит ЭТОТ КУСОК
5 апр 21, 14:22    [22304461]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp
ни разу блокировок не писал. Лочится кусок кода.. Второй поток не исполнит ЭТОТ КУСОК

ну вот, я про тоже, не подходит это
5 апр 21, 14:22    [22304462]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
PetroNotC Sharp
ни разу блокировок не писал. Лочится кусок кода.. Второй поток не исполнит ЭТОТ КУСОК

ну вот, я про тоже, не подходит это
куда не подходит?
ТЗ где?)))
5 апр 21, 14:24    [22304466]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp
ТЗ где?)))

править вектор в несколько потоков БЕЗ data race и sms

Сообщение было отредактировано: 5 апр 21, 14:18
5 апр 21, 14:25    [22304467]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
Заполнил вектор на миллион - отдал потоку.
Заполнил второй - отдал второму потоку.
НИЧЕГО НЕ ЛОЧИМ
5 апр 21, 14:26    [22304468]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
PetroNotC Sharp
ТЗ где?)))

править вектор в несколько потоков, и чтобы всё чётко
постановщика тебе надо грамотного
5 апр 21, 14:26    [22304471]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp
бабушкин зайчик,
Заполнил вектор на миллион - отдал потоку.
Заполнил второй - отдал второму потоку.
НИЧЕГО НЕ ЛОЧИМ

он правится потоками бесконечное кол-во раз по одной ячейке за раз

Сообщение было отредактировано: 5 апр 21, 14:21
5 апр 21, 14:26    [22304472]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
бабушкин зайчик
mayton
Мне кажется что поиск свободных дырок в массиве (задачка o(n) асимптоматичная) - нивелирует вообще все выгоды
которые автор хочет получить от мнимых оптимизаций и кешей и потоков. Тут по смыслу больше не vector подходит а set.

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

P.S. Scientia potentia est.

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

Еще один вектор где лежат одни дырки?
5 апр 21, 14:29    [22304474]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
mayton
Еще один вектор где лежат одни дырки?

адреса дырок
5 апр 21, 14:29    [22304475]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
PetroNotC Sharp
бабушкин зайчик,
Заполнил вектор на миллион - отдал потоку.
Заполнил второй - отдал второму потоку.
НИЧЕГО НЕ ЛОЧИМ

он заполняется потоками
смешно. Чтобы опять с одной миски все ели?)))))
5 апр 21, 14:31    [22304476]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

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

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

Начни с простого - один мутекс на всех, код будет как я выше показал 22304455 Только оптимизируй код так чтобы сначала подготовить нужные данные, затем блокировка, быстро прочитать/записать и снять блокировку.
Будет тормозить - тогда будешь дальше усложнять работу с блокировками. К тому времени немного опыта добавится.
5 апр 21, 14:32    [22304477]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
бабушкин зайчик
mayton
Еще один вектор где лежат одни дырки?

адреса дырок

А как менеджерить этот вектор адресов дырок? И как его блокировать? Он ведь тоже будет играть по правилам
твоей мультипоточки и ему точно также нужны будут мутексы или критические секции.
5 апр 21, 14:33    [22304478]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Мне нравится дизайн)))
Тарелок на столе нет.
Все потоки едоки варят кастрюлю супа.
Потом как сварили, начинают есть все из одной.
Толкаясь и матерясь. Почему никто в очередь не ставит строго по одному.
))
5 апр 21, 14:34    [22304480]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton
бабушкин зайчик
пропущено...

адреса дырок

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

Кстати, если у автора есть массив дырок, то не очень понятен его первый пост - где он предлагал вводить булеву
переменную в каждую ячейку - признак того, что ячейка пустая. Ну а как началась многопоточность то ваще.
5 апр 21, 14:38    [22304484]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
petrav
mayton
пропущено...

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

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

Одно другому не мешает: флаг пустоты нужен при проверке когда обращаешься к конкретной ячейке, а список индексов пустых для добавления новых, иначе перебор всего массива в поисках пустой.
5 апр 21, 14:43    [22304489]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dima T
бабушкин зайчик
пропущено...

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

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

Я вот честно не вижу смысла в мутексе вообще...
может опыта конечно мало, но он очевидно НЕ залочит сами данные, а без этого совершенно накласть на всё остальное.
А вот как обеспечить НЕвозможность записать в одну ячейку - вопрос остаётся открытым...
вешать где-то флаг, что эта ячейка занята и чекать его каждый раз?
это на сколько же %% похерит производительность?
5 апр 21, 14:43    [22304490]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
mayton
бабушкин зайчик
пропущено...

адреса дырок

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

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

Сообщение было отредактировано: 5 апр 21, 14:39
5 апр 21, 14:45    [22304491]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
А вот как обеспечить НЕвозможность записать в одну ячейку - вопрос остаётся открытым...

Вообще-то для этих целей мутекс используют обычно.
5 апр 21, 14:45    [22304492]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
А ты слышал что оракл не блокировочник а сиквел блокировочник?
Никто ведь не помер.
Узко вопросы задаешь.
5 апр 21, 14:46    [22304493]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
mayton
пропущено...

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

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

Достаточно добавить отдельный мутекс для работы с этим массивом.
5 апр 21, 14:49    [22304495]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dima T
бабушкин зайчик
А вот как обеспечить НЕвозможность записать в одну ячейку - вопрос остаётся открытым...

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

а мой случай обычный?
В моём случае он заблочит ячейку? Потому что даже если он заблочит весь вектор, это уже НЕ подходит.
Но он вроде даже и вектор не лочит...
5 апр 21, 14:49    [22304496]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
бабушкин зайчик

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

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

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

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

Кстати у меня к тебе настойчивая модераторская просьба - огласить полное ТЗ. Я понимаю
что для тебя это игровая задача и ты по ходу придумываешь брейнштомом всякие костыли
и подпорки в виде массивов индексов. Но мы просто топчемся на месте.
5 апр 21, 14:50    [22304497]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dima T
бабушкин зайчик
пропущено...

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

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

и все будут висеть и ждать его?
5 апр 21, 14:50    [22304498]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
Почитай про синхронизацию доступа:

https://www.google.com/search?q=синхронизация доступа к данным С

https://habr.com/ru/post/182610/
5 апр 21, 14:52    [22304501]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
mayton
Кстати у меня к тебе настойчивая модераторская просьба - огласить полное ТЗ.

так огласил же - запись в вектор в несколько потоков БЕЗ data race/race condition
5 апр 21, 14:53    [22304502]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

бабушкин зайчик
и все будут висеть и ждать его?

Нет, только те, кого ты заставишь это делать.

Posted via ActualForum NNTP Server 1.5

5 апр 21, 14:56    [22304505]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
mayton
Кстати у меня к тебе настойчивая модераторская просьба - огласить полное ТЗ.

так огласил же - запись в вектор в несколько потоков БЕЗ data race/race condition
а где тут скорость с первой страницы. И где Нужность дырок?
5 апр 21, 14:57    [22304508]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dima T
petrav
пропущено...

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

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

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

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

Короче, это ржачная тема.
5 апр 21, 14:57    [22304509]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
ТС, тебя закроют.
Код гони с проблемой.
5 апр 21, 15:00    [22304511]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
бабушкин зайчик
mayton
Кстати у меня к тебе настойчивая модераторская просьба - огласить полное ТЗ.

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

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

И еще надо-бы знать сколько будет потоков. Если их будет 100500 - тогда наверное лучше их ставить
в некую очердь команд. И надо знать (примерно) характер и род доступа к массиву. Если он - когерентный
- то мы можем шибко соптимизировать на близких адресах хотя-бы в пределах кеш-линий или страниц.
Если между потоками не нужен жесткий ордеринг команд - то мы можем переупорядочить поток команд
таким образом чтобы мы больше писали в кеш-линию и страницу чем рандомно. Так работали старые жесткие
диски (NCQ/TCQ). И вроде-бы никто не замечал логических ошибок чтения записи. Всё было прозрачно.
И вообще чем больше твой массив - тем больше надо думать об эффекте L2/L3.
5 апр 21, 15:00    [22304512]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Хотя дырки можно класть в конец массива и брать только с конца массива.
Если нам не важна последовательность в результирующем массиве.
5 апр 21, 15:02    [22304514]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

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

Массив дырок может быть, например, очередью. Или стэком.

Posted via ActualForum NNTP Server 1.5

5 апр 21, 15:03    [22304516]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
У него было волшебное слово "место" в массиве.Это он индекс наверно)))
5 апр 21, 15:04    [22304517]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
petrav
Хотя дырки можно класть в конец массива и брать только с конца массива.
Если нам не важна последовательность в результирующем массиве.

Да. У него получается кольцевой буфер. Но это все настолько сильно изменяет
первую постановку что можно просто выкидывать старые оптимизации и наново
проектировать новую задачу.
5 апр 21, 15:07    [22304520]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,

Можно проще. Поток на вектор с дырками и поток на вектор без дырок. Два вектора он сам предложил.
5 апр 21, 15:12    [22304527]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
petrav
Но это снова потребует блокировки всего массива вместе с массивом дырок, а не на уровне отдельных ячеек.

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

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

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

ТС похоже даже в теории не представляет как писать для многопоточности.
5 апр 21, 15:12    [22304528]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp
Можно проще. Поток на вектор с дырками и поток на вектор без дырок. Два вектора он сам предложил.

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

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

Сообщение было отредактировано: 5 апр 21, 15:19
5 апр 21, 15:21    [22304535]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
Dima T
Он про другие массивы не хотел, а про этот даже не подумал.

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

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

Все классы-контейнеры из std непотокобезопасные, поэтому при многопоточной работе с ними надо дополнительно прописывать синхронизацию доступа.
5 апр 21, 15:25    [22304542]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Автору нужно написать прототип класса. Где будет два закрытых массива: значения и дырки.
Описать сигнатуру методов и требования к этим методам в плане потокобезопасности.

Тогда можно предметно говорить как реализовывать этот класс. Иначе толку не будет.
5 апр 21, 15:29    [22304544]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
так, а что если при каждой записи создавать очередь?
чаще то будет чтение идти, запись так то сильно пореже
но чтобы совсем исключить шанс data race, что если эту попытку записи класть в очередь как-то (я не знаю как ф-ю покласть в очередь - можно ли?)

Сообщение было отредактировано: 5 апр 21, 15:29
5 апр 21, 15:37    [22304553]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
Еще немного и врубишься что потокам надо создавать или нарезать задачи.
А не наоборот, городить потоки возле одной кастрюли
5 апр 21, 15:45    [22304560]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
так, а что если при каждой записи создавать очередь?

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

Чего ты так мутексов испугался? Они быстро работают, а без них многопоточная работа невозможна.
5 апр 21, 15:48    [22304567]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dima T,
По правде говоря, без блокировок тоже можно работать. В веб даже рекомендуется.
Из двух зол выбрали меньшее.)
5 апр 21, 15:51    [22304574]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dima T,
Правда это для для java.
Но суть что код надо подстраивать под параллелизм.
Ибо компромиссы!
автор
Компромиссы
Стратегия высокого параллелизма реагирует на требования высокого параллелизма снижением охвата транзакции до уровня, минимально возможного в данной архитектуре. Это приводит к более быстрому завершению (фиксации или откату) транзакции, чем при использовании стратегии слоя API. Однако, как учит нас история хорошего корабля Vasa (см. Ресурсы), вы не можете иметь все и сразу. Жизнь состоит из компромиссов, и обработка транзакций – не исключение. Не можете же вы впрямь рассчитывать одновременно и на такой же уровень надежности обработки транзакций, что и в стратегии слоя API, и на максимальное количество параллельных обращений и максимальную пропускную способность при пиковых нагрузках.

http://www.k-press.ru/cs/2009/3/ts/ts.asp
5 апр 21, 16:03    [22304588]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dima T
Как ты себе это представляешь? Покажи как в коде это будет выглядеть.

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

да не испугался, а не вижу смысла, если вектор висит особняком, а потоки лочить, то какой толк от мутексов?
есть толк от них? Залочил поток и другой тоже залочил, так они же всё равно в одну ячейку смогут записать, потому что она то НЕ залочена...
5 апр 21, 16:04    [22304589]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
PetroNotC Sharp
По правде говоря, без блокировок тоже можно работать. В веб даже рекомендуется.

В вэб-сервере каждый поток сам по себе работает и нет никаких данных разделяемых между разными потоками, нечего блокировать.
5 апр 21, 16:05    [22304590]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
PetroNotC Sharp
Dima T,
По правде говоря, без блокировок тоже можно работать. В веб даже рекомендуется.
Из двух зол выбрали меньшее.)

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

Как разрабатывать ПО вообще без блокировок - ХЗ. Есть для этого технология Акторов.
Но у нее есть свои проблемы. И свои сложности дизайна.
5 апр 21, 16:09    [22304594]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
Dima T
Как ты себе это представляешь? Покажи как в коде это будет выглядеть.

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

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

Каша у тебя в голове, не понимаешь как блокировки работают. Нельзя залочить ячейку, нет такой операции "залочить ячейку".
Я ссылки давал выше 22304501, почитал? Почитай хотя бы статью на хабре.
5 апр 21, 16:11    [22304599]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dima T,
В веб потоки тоже ресурс. И очень даже дорогой.
У веб сервера их 10 штук примерно.
А юзверей пусть пол лимона.
ТС похоже свой сервер пишет)))))
Где ище миллион вектор?
5 апр 21, 16:11    [22304601]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Я же не о технических говорил.
Нельзя узко про одни блоки вещать.
5 апр 21, 16:14    [22304609]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Ты пишешь дескыть Оракл не использует блокировки. Я уточняю что в понимании ОС он их еще как использует.

Просто на уровне транзакций - другой подход. И другие блокировки.
5 апр 21, 16:15    [22304611]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dima T,

Вообще, в веб параллельный доступ осуществляет субд..
Почему автор решил субд заново изобрести не знаю
5 апр 21, 16:16    [22304613]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton
Ты пишешь дескыть Оракл не использует блокировки. Я уточняю что в понимании ОС он их еще как использует.

Просто на уровне транзакций - другой подход. И другие блокировки.
я написал он не блокировочник. Механизм другой! Без блоков!
5 апр 21, 16:17    [22304614]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dima T
Я ссылки давал выше 22304501, почитал? Почитай хотя бы статью на хабре.

обязательно прочитаю, но позже.
Так я и написал, что не залочится. Это то я понимаю. Я не понимаю, зачем мне мутекс в таком случае...
Надеюсь хабр даст ответ.
5 апр 21, 16:18    [22304616]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Кстати, есть же концепция "множество читателей - один писатель". Только я, за ненадобностью, не помню
как её реализовать на C++. Даже названия не помню. :(
5 апр 21, 16:23    [22304620]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
Dima T
Я ссылки давал выше 22304501, почитал? Почитай хотя бы статью на хабре.

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

Метод в векторе Добавить сначала запишет объект а потом увеличит счетчик Count.
Если два потока сразу, то эти две строки пемешаются.
Райзе будет.
Так понятно?
5 апр 21, 16:24    [22304623]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Еще про fairness не говорили.
5 апр 21, 16:25    [22304624]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
Шо будет если строки перемешать?))))
public void deleteLast(Vector list) {
    int lastIndex = list.size() - 1;
    list.remove(lastIndex);

Давай уж код начнем писать)))
5 апр 21, 16:34    [22304629]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Самый простой способ Не блокирования это клонирование коллекции или ее куска.
Широко применяется. Нет никаких особых последствий.
И никаких мьютексов.
5 апр 21, 16:41    [22304641]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
А я предлагаю обсудить кто первый получит доступ к g_mutex после того как самый первый поток его отпускает.

{
   // in thread 1
   lock(g_mutex);
   // very long action
   unlock(g_mutex);
}



{
   // in thread 2
   lock(g_mutex);
}


{
   // in thread 3
   lock(g_mutex);
}
5 апр 21, 16:42    [22304643]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp
бабушкин зайчик
пропущено...

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

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

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

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

Сообщение было отредактировано: 5 апр 21, 16:40
5 апр 21, 16:45    [22304647]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
бабушкин зайчик


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


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

И не забывай про DWORD/ia32.
5 апр 21, 16:49    [22304653]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
В java лочатся все публичные методы для вектора с названием фабричного метода Collections.synchronizedXxxxx
Но есть и штук 30 других коллекций.
...
Если диапазон, то лочить не надо. Каждому потоку по тарелке
5 апр 21, 16:53    [22304656]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
mayton
Это идеальный параллелизм. Shared Nothing.

ну вообще-то шанс то остаётся, что 2 потока залезут в одну ячейку
5 апр 21, 17:00    [22304657]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
ТС, идите в..... Qt!
Чем вы будете лисапед писать первый раз в жизни.
автор
QtConcurrent имен предоставляет API - интерфейсы высокого уровня , которые делают возможным написание многопоточных программ без использования низкоуровневых поточных примитивов , таких как мьютексы, блокировки чтение-запись, условия ожидания или семафоры. Программы, написанные с помощью QtConcurrent, автоматически регулируют количество используемых потоков в соответствии с количеством доступных ядер процессора. Это означает, что приложения, написанные сегодня, будут продолжать масштабироваться при развертывании в многоядерных системах в будущем.
5 апр 21, 17:01    [22304658]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
бабушкин зайчик
mayton
Это идеальный параллелизм. Shared Nothing.

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

Мне бабушка говорила
- Не ешь с пола.
- Одевай зимой шерстяные штаны.
- И выравнивай доступ к памяти по регистру.
5 апр 21, 17:02    [22304659]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
mayton
- И выравнивай доступ к памяти по регистру.

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

ВАУ! круто. вот оно, мечта!!1
жаль что говно (
5 апр 21, 17:09    [22304664]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
))))
>жаль что говно (
Верю что транзакции в банке напишешь надежнее на тетрисе)))
5 апр 21, 17:13    [22304667]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
Dima T
Я ссылки давал выше 22304501, почитал? Почитай хотя бы статью на хабре.

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

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

И про кучу векторов ты неверно совет mayton`а расширил, он всего лишь предложил вынести флаг свободной ячейки в vector<bool>. Это не значит что если у тебя N полей надо N векторов.
Просто vector<bool> особенный, в нем 1 бит на значение, а тип bool - 1 байт. Экономия памяти в 8 раз.
5 апр 21, 17:34    [22304679]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
petrav
Кстати, есть же концепция "множество читателей - один писатель". Только я, за ненадобностью, не помню
как её реализовать на C++. Даже названия не помню. :(

Есть такое, std::shared_mutex, но он тормоз, т.к. счетчик читателей меж кэшей всех потоков гоняется.
5 апр 21, 17:36    [22304681]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

PetroNotC Sharp
Где ище миллион вектор?

Тут: https://www.sql.ru/forum/1326703/vector-na-trillion-obektov

Posted via ActualForum NNTP Server 1.5

5 апр 21, 17:48    [22304689]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
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.

уверен, что это хорошая мысль?
Dimitry Sibiryakov
Тут: https://www.sql.ru/forum/1326703/vector-na-trillion-obektov

интересно, но там больше про БД
а вообще не мой случай
6 апр 21, 00:15    [22304851]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
вот мой случай
за исключением того, что там 2 потока работают с разными кусками вектора (0-10 и 10-20), поэтому проблемы нет
а у меня оба работают с 0-20 и проблема есть
Проблема в том, что mutex берется первым потоком, а второй поток не может работать, пока он не будет освобожден.

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

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

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

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

BUT:

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

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

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

у меня потоки нужны для чтения, а на запись операций в разы меньше
поэтому можно было бы либо лочить вектор просто (его ведь читать можно будет?), но это затраты, как выше описано
либо запись делать одним потоком (если можно одновременно в многопоточном приложении такое сделать?
По идее можно, ведь я могу внутри ф-и, которая вызывается на событии, сделать разделение на чтение/запись и параллелить только чтение...)
(ушёл читать хабр)

Сообщение было отредактировано: 6 апр 21, 02:09
6 апр 21, 02:11    [22304862]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
автор
Does not guarantee that different elements in the same container can be modified concurrently by different threads.

уверен, что это хорошая мысль?

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

Можно работать многопоточно без синхронизации только если разработчик явно об этом заявляет. Ключевое слово threadsafe (потокобезопасно). Например ConcurrentDictionary в C#.
6 апр 21, 07:28    [22304873]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
>у меня потоки нужны для чтения, а на запись операций в разы меньше
= где обоснование что они нужны если кода нет и ты их не писал в жизни?
Вполне можно взять Фоновый Один поток и пусть работает тихо и незаметно.
Если одним писать и другим читать, то это и есть подводные камни.
6 страниц а ты до сих пор ничего не понял.
6 апр 21, 08:01    [22304878]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
У меня - есть стойкое убеждение, что подобного рода споры не имеют смысла без макета исходного кода.

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

В следующий раз - приводите код.
6 апр 21, 08:50    [22304893]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4 5 6      [все]
Все форумы / C++ Ответить