last day (15 days later) » 

9:00 PM
0
Q: Является ли выполнение параллельным

QuesterВсе привет. НЕмного затупил с конкурентным заполнением мапы. Нашел в итернете, как сделать конкурентное заполнение мапы безопасным для данных, но вот хз как проверить, что запись происходит именно конкурентно а не последовательно. Есть ли способ это выяснить. Вот код package main import ( "log

 
конкурентное != параллельное
 
umd
@user7860670 это я знаю, но в нашем случае это будет одно и то же. Ибо го
 
Это ни в коем случае не одно и то же. По сути у вас написана последовательная версия к которой добавлен оверхед от запуска горутин и синхронизации через мьютекс. Оно бы не было параллельным, даже если бы использовались настоящие потоки.
 
umd
@user7860670 а в добавленом коде параллельно? По идее должно быть
 
В ответе написана полная белиберда. На отсутствие параллельности при вставки в map предложенные изменения никак не влияют. Отсутствие параллельности возникает из-за невозможности одновременного выполнения mp[i] = data[i] в разных потоках. Собственно синхронизация через мьютекс как раз это предотвращает. А без синхронизации оно не будет работать корректно, так как map не является потокобезопасным.
 
umd
9:00 PM
@user7860670 если я правильно понял, то надо запускать из основной функции грутины, а внутри inserting оно не распараллелится? Я добавил еще третий вариант, правильно ли я использую теперь? ОПисал какую проблему я ловлю при выполнении этой функции
 
@user7860670 не понял на счет белиберды, в примере сделана синхронизация через мютекс
 
Нет, вы поняли не правильно. Оно не распараллелится вообще никогда. Что касается последнего варианта, wait.Done() вызывается не из запущенной горутины, а из main, соответственно и ожидания завершения горутин не происходит. Собственно в первом варианте было все правильно в плане синхронизации и использования waitgroup.
 
@user7860670 wait.Done() виже в горутине у него
 
@MaksimFedorov В горутине там есть только Insert.
 
@user7860670 да, вижу, простите... не увидел
 
umd
9:00 PM
@user7860670 Добавил еще код. Считается ои это конкурентной записью в мап?
 
@Quester нет, тк нет конкурентности и код синхронно выполняется. Он безопасен, но не конкурентен
 
umd
@user7860670 я вообще не понимаю, как сделать запись конкурентно
 
Коротко: ваш код самый первый корректный, просто я отвечал как протестировать :) для этого немного улучшил структуру, чтобы каши не было и добавил инструкций для проверки
 
Конкурентными (но не параллельными) можно считать все три предыдущих варианта, ведь там запускались горутины. А последний - это простой последовательный вариант даже без горутин. И mutex там ни к чему, ведь синхронизировать доступ не с кем. Ну и как я уже написал в своем первом комментарии, не стоит отождествлять конкурентность и параллельность.
 
umd
@MaksimFedorov то есть, если стоит задача "Реализовать конкурентную запись в мап" то первый вариант подходит?
 
9:00 PM
@Quester подходит, если не считать момент, что лучше обернуть в структурку с инкапсулирвоанной логикой блокировки, через которую и будете работать (для чистоты, что я и приводил в примере)... а то грязновато
 
umd
@MaksimFedorov как во втором варианте?
 
umd
@MaksimFedorov я очень близко топтался
@MaksimFedorov Перед тем как прочитать ваше ообщение,как раз подумал, чтонужно wait group передавать в функцию заполнения мапы
@MaksimFedorov итоговый вариант добавил в вопросю ТОлько немного поменял(использовал то что уже ранее написал сам, но сделал ожидание завершения горутины по вашему ответу Главное что благожаря таким скорым ответам, я вроде +- понял как это делать). Хотя еще конечно есть с чем разбираться. Если напишете ответ, я помечу его как правильный
@user7860670 Благодарю. Ваши быстрые ответы также помогли разобраться)
 
9:34 PM
посмотрите др свои вопросы по gracefull — там корректные овтеты
а так у вас все хорошо, и отвечать нечем :)
 

last day (15 days later) »