Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6   вперед  Ctrl      все
 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
Сообщений: 51017
Мне кажется что поиск свободных дырок в массиве (задачка 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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6   вперед  Ctrl      все
Все форумы / C++ Ответить