Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / C++ |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 [3] 4 5 6 вперед Ctrl→ все |
бабушкин зайчик Member Откуда: сетевой Сообщений: 61 |
а можно не надо? Хотелось бы в теории прояснить всё, а не в продакшене. |
||||
5 апр 21, 13:41 [22304405] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
"Надо, Федя, надо." Теория тут как собаке пятая нога. Posted via ActualForum NNTP Server 1.5 |
||
5 апр 21, 13:45 [22304407] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
бабушкин зайчик, Какой продакшен без ТЗ? Смешно. |
5 апр 21, 13:49 [22304412] Ответить | Цитировать Сообщить модератору |
ну я Member Откуда: Москва Сообщений: 1255 |
"пустая это ячейка или нет" - такая формулировка автором трактуется как именно - 1) ячейка может не существовать - тогда она какая? отсутствующая или пустая? 2) для проверки на пустоту ячейка должна существовать и свойство пустоты - признак ячейки или функция контейнера? |
||||
5 апр 21, 13:55 [22304416] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15689 |
Лочится не код, а данные к которым он обращается. Например залочил ты функцию f1(), которая работает с ячейкой A, другие потоки не смогут f1() выполнить пока этот не доработает, но если есть f2() которая тоже работает с ячейкой A, то нет никакой пользы от блокировки f1()
Никто не полезет в незалоченные. Я так понимаю у тебя несколько векторов и ты работаешь с элементами с одинаковым индексом: v1[i], v2[i], v3[i], где i не меняется. Делаешь еще один вектор мутексов и лочишь vm[i]. Т.к. i у тебя может быть миллион, а миллион мутексов это многовато, поэтому vm можно уменьшить в N раз и для блокировки использовать vm[i/N]. Тогда на каждые N ячеек будет общий мутекс. |
||||||||||||||||
5 апр 21, 13:55 [22304417] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Нет, технически таки лочится кусок кода от параллельного выполнения. Просто обычно вменяемые программисты в этом куске кода пишут обращение к данным и таким способом получают лок обращения данных (или, короче, лок данных). Но нубов лучше не путать. Они же теорию хотят. Posted via ActualForum NNTP Server 1.5 |
||
5 апр 21, 14:02 [22304424] Ответить | Цитировать Сообщить модератору |
бабушкин зайчик Member Откуда: сетевой Сообщений: 61 |
запаришься отлавливать такие баги потом ещё найди их сначала... где там цифра стоит 1, когда должна была быть 2, а ты понятия не имеешь, что должно было быть Сообщение было отредактировано: 5 апр 21, 14:02 |
||||||
5 апр 21, 14:06 [22304427] Ответить | Цитировать Сообщить модератору |
бабушкин зайчик Member Откуда: сетевой Сообщений: 61 |
это именно мой случай а что делать? |
||||
5 апр 21, 14:07 [22304429] Ответить | Цитировать Сообщить модератору |
бабушкин зайчик Member Откуда: сетевой Сообщений: 61 |
нет. Индексы всегда произвольные. НО есть шанс, что оба потока залезут в одинаковый v1[i] Сообщение было отредактировано: 5 апр 21, 14:00 |
||||
5 апр 21, 14:08 [22304430] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15689 |
Читать написанное до конца 22304417 |
||||||||
5 апр 21, 14:08 [22304432] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15689 |
Один поток работает только с одним конкретным i или с разными? Т.е. {v1[5], v2[5], v3[5]} или {v1[4], v2[7], v3[6]} ? Если первое, то мутекс как я писал 22304417 |
||||||||
5 апр 21, 14:11 [22304436] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 51017 |
Мне кажется что поиск свободных дырок в массиве (задачка o(n) асимптоматичная) - нивелирует вообще все выгоды которые автор хочет получить от мнимых оптимизаций и кешей и потоков. Тут по смыслу больше не vector подходит а set. Но это моё частное мнение и если автор хочет - ну пускай делает пробы с o(n) по массиву-миллионнику. P.S. Scientia potentia est. |
5 апр 21, 14:12 [22304438] Ответить | Цитировать Сообщить модератору |
бабушкин зайчик Member Откуда: сетевой Сообщений: 61 |
так я же так и хочу - внутри вызываемой ф-и делается запись в вектор, а ф-я лочится или это другое? |
||||||
5 апр 21, 14:12 [22304439] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
https://ru.m.wikipedia.org/wiki/Параллельные_вычисления |
||||||||
5 апр 21, 14:15 [22304445] Ответить | Цитировать Сообщить модератору |
бабушкин зайчик Member Откуда: сетевой Сообщений: 61 |
а не надо искать, надо вектор дырок держать
каждый поток может залезть в v1[1] ИЛИ v1[2] ИЛИ vN[M] - в любой НО всегда есть шанс, что оба залезут в одну ячейку и такой баг потом хер поймаешь |
||||||||||||
5 апр 21, 14:15 [22304448] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Не сработает, потому что в задаче N не константно и может увеличиваться. Всё равно придётся блокировать доступ ко всему массиву. |
||||
5 апр 21, 14:16 [22304450] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Вот именно поэтому-то "опыт - сын ошибок трудных". Отловишь пару и враз получишь левель ап. Posted via ActualForum NNTP Server 1.5 |
||
5 апр 21, 14:17 [22304451] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
|
||||||||
5 апр 21, 14:17 [22304452] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15689 |
Так это выглядит в простейшем случае 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] Ответить | Цитировать Сообщить модератору |
бабушкин зайчик Member Откуда: сетевой Сообщений: 61 |
вот только Dima T говорит, что это не поможет и я с ним согласен, если сами данные не лочатся
так а ячейка в v то залочится или нет? Сообщение было отредактировано: 5 апр 21, 14:13 |
||||||||
5 апр 21, 14:19 [22304459] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
|
||||||||
5 апр 21, 14:22 [22304461] Ответить | Цитировать Сообщить модератору |
бабушкин зайчик Member Откуда: сетевой Сообщений: 61 |
ну вот, я про тоже, не подходит это |
||||
5 апр 21, 14:22 [22304462] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
ТЗ где?))) |
||||||||
5 апр 21, 14:24 [22304466] Ответить | Цитировать Сообщить модератору |
бабушкин зайчик Member Откуда: сетевой Сообщений: 61 |
править вектор в несколько потоков БЕЗ data race и sms Сообщение было отредактировано: 5 апр 21, 14:18 |
||||
5 апр 21, 14:25 [22304467] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
бабушкин зайчик, Заполнил вектор на миллион - отдал потоку. Заполнил второй - отдал второму потоку. НИЧЕГО НЕ ЛОЧИМ |
5 апр 21, 14:26 [22304468] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 [3] 4 5 6 вперед Ctrl→ все |
Все форумы / C++ | ![]() |