![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Здравствуйте.
Столкнулся с такой проблемой: если создать std::thread, а затем "быстро" его удалить, то запуск всё равно происходит, но уже с удалённым объектом. Вот код
http://liveworkspace.org/code/5bd9310f0a7f...fa0b73b5323d53e вот вывод
видно, что 1-й поток отработал как надо, а 0-й удалился раньше, чем отработал и bind'нутая ф-ция run() теперь указывает в никуда. Вопрос: что я не так делаю ? Как убедиться, что запуск потока прошёл - желательно в ф-ции start(), но можно и в деструкторе. Спасибо -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Ты делаешь join в деструкторе базового класса Thread, который вызывается уже после уничтожения его наследника (т.е. ThreadImpl). Т.е. здесь join() в принципе может и не успеть сработать, удаляется ThreadImpl, потом поток запускает функцию run(), но объекта ThreadImpl уже не существует
Можно просто перенести деструктор в ThreadImpl, но вообще я бы не стал писать join() в деструкторе. Это сообщение отредактировал(а) azesmcar - 22.2.2012, 11:37 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Спасибо. Перенёс - заработало. Теперь, кажется, понял в чём дело - join() не то, чтобы не отрабатывал, а до него просто не доходило управление. В деструкторе наследника грохаласьего виртуальная таблица, затем управление переключалось на поток, который пытался запустить run()... Спасибо. Вот, если кому нужно, доработанный вариант (правда, в наследнике приходится вызывать wait())
http://liveworkspace.org/code/8554941a87fb...1a557fbbf9c6076 Тему закрываю, но если у кого есть предложения по импрувменту класса - велкам. azesmcar, сорри, что теперь репутация не круглая Это сообщение отредактировал(а) borisbn - 22.2.2012, 13:01 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Ну давай что ли, раз такое дело Зачем нужен этот класс и какую задачу он пытается решить? Добавлено через 34 секунды
Ну давай что ли, раз такое дело Зачем нужен этот класс и какую задачу он пытается решить? |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Насмотрелся на Qt...
Хотел обернуть std::thread, чтобы запуск потока происходил не в конструкторе, а в каком-нибудь start(), а также чтобы при разрушении этого класса деструктор дожидался бы окончания работы потока. В общем, чтобы использование такого класса сводилось бы к минимуму: наследоваться и переписать ф-цию run()
пока не получается... Это сообщение отредактировал(а) borisbn - 22.2.2012, 14:06 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Для чего? Чтобы создать поток? Есть std::future, std::async, пользователю нужно только написать функцию, зачем наследовать класс? Зачем нужен такой класс вообще? Этот объект будет постоянно висеть в памяти и выполнять какую нибудь задачу или ты его создашь, поток завершиться и объект можно удалять? Если первое, то это не очень-то хорошо. Поток скорее всего не будет работать круглосуточно, он будет иногда выполнять некую работу, а в остальное время будет спать (читай зря потреблять ресурсы). Если второе, то зачем для этого писать целый класс? |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
да
Какие ресурсы он будет потреблять ? Память ? Ну.. этим я могу пожертвовать. Дело в том, что я стараюсь делать потоки таким образом, чтобы они ожидали какого-нибудь события (в венде WaitForSingleObject) и по наступлении - делали своё чёрное дело - и опять ожидали. Хммм. Несколько раз слышал такое мнение о наследовании, но никто не мог толком объяснить, чем это хуже, чем передавать в класс "поток" свой функтор ? Надеюсь Вы сможете втолковать. Добавлено через 1 минуту и 44 секунды Дико извиняюсь за офф-топ, но не создавать же ради этого тему А что, на LWS не работают делегирующие конструкторы ??? http://liveworkspace.org/code/c8c5d425f349...87a581cbfe19f24 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
А чем собственно класс лучше? Как минимум это больше кода и вызов виртуальной функции там, где он абсолютно не нужен. Еще это ненужные классы и наследование. В чем плюс такого класса?
Вообще-то если вдуматься можно и объекты по константной ссылке не передавать А не лучше ли ему заняться делом? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
borisbn, std::thread/boost::thread прекрасны тем, что могут выполнить в потоке любой callable объект, без явного создания/оборачивания его в какую-либо сущность. а ты их так использовать решил.. бррр....
в 4.6.2 они не реализованы. |
|||
|
||||
| borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Ну, как минимум тем, что он сам следит за тем, чтобы дождаться завершения работы потока. Т.е., чтобы не было такой ситуации
Кол-во кода - сравнимо, а вызов виртуальной функции происходит один раз при запуске потока. ну... вот пример такого потока
второе бррр... за сегодня и ни одного объяснения чем подход с callable-объектом лучше -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
RAII. объяснил. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
> RAII.
А я что пытаюсь сделать? Добавлено через 5 минут и 1 секунду Кста, с праздником, господа! -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
привинтить наследование туда, где можно сделать обертку адаптер.. |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
borisbn
Я не совсем понимаю чем твой вариант лучше например вот такого?
Это сообщение отредактировал(а) azesmcar - 23.2.2012, 09:47 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |