powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / как обнулить ячеку вектора (не удаляя)?
25 сообщений из 146, страница 3 из 6
как обнулить ячеку вектора (не удаляя)?
    #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
25 сообщений из 146, страница 3 из 6
Форумы / C++ [игнор отключен] [закрыт для гостей] / как обнулить ячеку вектора (не удаляя)?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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