0 / 0 / 0
Регистрация: 17.07.2020
Сообщений: 19
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Передача в поток указателя на объект через std::cref30.07.2020, 12:30. Показов 4993. Ответов 10
Всем доброго времени суток!
Столкнулся с непонятным, для меня, поведением передаваемого в поток параметра: Имеется некая структура данных с заранее заданным именем m_sName:
Код
Create thread: name1 Start thread: name1 Create thread: name2 Create thread: name3 Start thread: name3 Start thread: name3 Create thread: name4 Start thread: name4 ... Всем заранее спасибо!
0
|
30.07.2020, 12:30 | |
Ответы с готовыми решениями:
10
Передача указателя на объект класса через this В чем отличия между std::cref() и std::bind()? Передача в поток указателя на контекст устройства Как создать объект оператором new, если имеется только тип указателя на объект, переданный через шаблон? |
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
|
|
30.07.2020, 12:46 | 2 |
Obj - это локальный объект, а вы передаёте ссылку на него.
Он умрет сразу после очередной итерации цикла. Зачем? Указатель можно передавать по значению.
1
|
0 / 0 / 0
Регистрация: 17.07.2020
Сообщений: 19
|
|||||||||||
30.07.2020, 12:53 [ТС] | 3 | ||||||||||
zayats80888
Obj - это указатель на StructDsc, почему он должен умереть? Вот так:
0
|
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
|
|
30.07.2020, 12:59 | 4 |
Сообщение было отмечено Иван_79 как решение
Решение
Не важно, указатель или что другое, время его жизни ограничено скоупом тела цикла.
А в поток фактически вы передаёте не указатель на StructDsc , а адрес(ссылку) локального указателя на StructDsc. нет, первый вариант.
1
|
0 / 0 / 0
Регистрация: 17.07.2020
Сообщений: 19
|
|||||||||||
30.07.2020, 13:03 [ТС] | 5 | ||||||||||
Тогда в каком случае следует использовать
0
|
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
|
|
30.07.2020, 13:12 | 6 |
Когда функция потока принимает параметр по ссылке(должна работать с объектом, а не его копией) и, что важно(!),
объект должен быть жив на момент обращения к нему по ссылке(проще говоря, он должен умирать не раньше, чем объект потока, хотя это не обязательно, достаточно что бы последнее обращение к нему по ссылке происходило межпоточно-раньше(inter-thread happens-before) вызова его деструктора)
0
|
0 / 0 / 0
Регистрация: 17.07.2020
Сообщений: 19
|
||||||
30.07.2020, 13:36 [ТС] | 7 | |||||
Тогда если я хочу передать в поток, ну скажем его номер, и делаю это так
0
|
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
|
|
30.07.2020, 14:13 | 8 |
Если функция потока не должна изменять значение iNum(хотя она может изменять копию этого значения в своих целях, ей главное получить начальное значение)
или не должна видеть изменения значения iNum из других потоков, то разумно передавать копию. --- Не по теме: Иван_79, прежде чем осваивать многопоточность, советую освоить базовый курс С++, а то у вас плохое понимание базовых вещей, таких как время жизни объекта, что такое указатели и ссылки, как передаются параметры в функции и т.д.
1
|
18828 / 9831 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
|
|
30.07.2020, 14:14 | 9 |
Тут для использования cref у вас главное, чтобы
iNum был жив столько, сколько требуется потоку для работы с ним.В вашем коде уже заведомо напрашивается проблема, потому что видно, что вы позаботились о том, чтобы поток жил нужное вам время, разместив его динамически. А номер вы оставили локальной переменной, время жизни которой ограничено ее scope-ом. Вы должны рассчитывать где и сколько живут ваши объекты.
1
|
0 / 0 / 0
Регистрация: 17.07.2020
Сообщений: 19
|
|||||||||||
30.07.2020, 14:22 [ТС] | 10 | ||||||||||
DrOffset
Но в поток я передаю значение
Почему значение, в этом случае, будет ограничено временем временем жизни iNum? Реализация потока
0
|
18828 / 9831 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
|
|
30.07.2020, 14:38 | 11 |
Иван_79, речь о использовании
cref /ref , т.е. о ссылках.Добавлено через 4 минуты Вы в своем примере написали следующее: именно этот пример я и комментирую.
1
|
30.07.2020, 14:38 | |
30.07.2020, 14:38 | |
Помогаю со студенческими работами здесь
11
Передача указателя на объект как параметра функции Передача в метод по перегрузке оператора указателя на объект Передача указателя в класс на объект другого класса Реализация передачи указателя на объект через очередь сообщений Передача указателя на класс через SendMessage Стандартный поток и STL (std::copy to std::cout) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |