13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||||||
1 | ||||||
Terminate called without an active exception12.01.2020, 17:16. Показов 28083. Ответов 73
Метки нет Все метки)
(
При компиляции такого примера:
Санитайзеры включены: set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address") set (CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address") Но без них врде тоже самое. Что я делаю не так ?
0
|
12.01.2020, 17:16 | |
Ответы с готовыми решениями:
73
Terminate called С++ Ошибка: terminate called after throwing an instance of 'std::bad_alloc'
|
19410 / 10029 / 2443
Регистрация: 30.01.2014
Сообщений: 17,682
|
|
12.01.2020, 19:54 | 21 |
Никак. Вы уже сказали через detach, что вас НЕ интересует дальнейшее управление потоком. Но потом вдруг выясняется, что все-таки оно вас интересует. Не находите здесь логического противоречия?
Вы можете обосновать зачем понадобилось его отсоединять?
1
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
12.01.2020, 19:56 [ТС] | 22 |
Мне нужно чтобы поток выполнялся не квазипараллельно, а параллельно основному потоку.
Но на этапе его уничтожения, я хочу вернуть контроль.
0
|
19410 / 10029 / 2443
Регистрация: 30.01.2014
Сообщений: 17,682
|
|
12.01.2020, 20:11 | 23 |
Оно и так будет параллельно работать. Откуда вы это взяли?
Добавлено через 12 минут Квазипараллельность выполнения зависит от железа и ОС, на уровне std::thread\pthread, вы никак на это не влияете. Состояние потока joinable - это не про квазипараллельность, это про контроль освобождения ресурсов.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
12.01.2020, 20:14 [ТС] | 24 |
Понял.
Вот только ваш пример некроссплатформенный в части pthread_testcancel(); pthread_cancel в винде я могу заменить TerminateThread(GetThreadID(), 0); И тогда как быть pthread_testcancel(); ? Просто не использовать его в винде ?
0
|
19410 / 10029 / 2443
Регистрация: 30.01.2014
Сообщений: 17,682
|
|
12.01.2020, 20:36 | 25 |
testcancel я использовал потому что std::thread поддерживает cancel только в так называемых cancellation points. Поэтому я поставил pthread_testcancel, чтобы создать такую точку.
Что касается винды, то можно использовать порт pthread - pthread_win32. Если вы используете mingw для компиляции для винды, то pthread, как правило, уже есть в комплекте. Что касается TerminateThread, то ему все равно на пользовательский код внутри функции потока, он просто грохнет выполнение и все. В этом смысле эта функция более походит на pthread_kill c сигналом SIGKILL .
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||||||
12.01.2020, 21:48 [ТС] | 26 | |||||
Я сделал так:
Добавлено через 4 минуты Пока не чувствую что я чемто управляю. Добавлено через 14 минут Впринцепи tgkill должен справится, но ему нужен самы родной природной хендл, а непосиксовый. Добавлено через 41 секунду А как его узнать снаружи потока ?
0
|
19410 / 10029 / 2443
Регистрация: 30.01.2014
Сообщений: 17,682
|
|
12.01.2020, 21:49 | 27 |
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
12.01.2020, 21:53 [ТС] | 28 |
Затем что вариант с canselation point не особо нравится. В процедуре потока хочется обойтись без
#ifdef винда ... #else линукс ... #endif Все эти примочки лучше в деструктор.
0
|
19410 / 10029 / 2443
Регистрация: 30.01.2014
Сообщений: 17,682
|
|
12.01.2020, 22:11 | 29 |
1) Если у вас в процедуре потока не пустой цикл, то они там вероятнее всего и так будут.
Кликните здесь для просмотра всего текста
2) Также при использовании pthread_win32 надобность в #ifdef винда отпадет. 3) Также можно использовать boost::thread вместо std::thread - он может прерывать потоки. https://www.boost.org/doc/libs... terruption 4) Также можно сделать прослоечную функцию, в которой активировать флаг PTHREAD_CANCEL_ASYNCHRONOUS через pthread_setcancelstate, чтобы pthread_cancel работал без cancellation points. (функция нужна, чтобы оставить вашу основную процедуру потока без платфомозависимых вызовов). Использования функций жесткого завершения может привести к потере ресурсов или оставления ресурсов (например мьютексов) в некорректном состоянии. Нужно стараться избегать их всеми средствами.
1
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
12.01.2020, 22:22 [ТС] | 30 |
Ну этот код не связан с какйто конкретной задачей.
В реальной обёртке предусметрено несколько путей завершения потока. Но деструктор должен уметь грохать поток, когда он не хочет завершаться по хорошему. pthread_win32 не имеет сильной поддержки. АПИ у винды немного поменяется в новой версии и у мингвешников не скоро дойдут руки поменять свой сурогат. Когда поток надо завершить принудительно, никакие прослойки могут не помочь. Добавлено через 7 минут Когда поток не хочет завершаться по хорошему, на потерю ресурсов при принудительном завершении можно не бращать внимание.
0
|
19410 / 10029 / 2443
Регистрация: 30.01.2014
Сообщений: 17,682
|
|
12.01.2020, 22:39 | 31 |
Тогда и на корректную работу приложения тоже можно не обращать внимания после этого. Если вас это устраивает - пожалуйста.
Вот именно, когда. А вы по умолчанию пытаетесь впихнуть самый жесткий метод, о чем я вас и предупредил. В остальном, я вам дал достаточно вариантов.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
12.01.2020, 22:43 [ТС] | 32 |
Дак я уже три раза сказал, что код обстрагирован от реальной задачи. Тут просто прорабатываю самый жёский вариант, но в реальном коде конечно сначало будет попытка "договарится по хорошему"
Вариантов недостаточно, потомучто поток может зависнуть в месте которое не имеет отношение к cancelation point.
0
|
19410 / 10029 / 2443
Регистрация: 30.01.2014
Сообщений: 17,682
|
|
12.01.2020, 22:46 | 33 |
Вообще потоки, когда вероятной ситуацией является зависание, обычно не используют. Потому что их принудительное завершение всегда чревато потерей стабильности. Т.е. после такого завершения потока, разделяемые ресурсы уже будет невозможно привести к корректному состоянию, как, впрочем, и гарантированно узнать, что они в нем находятся. Единственное что можно сделать - это завершить весь процесс и перезапуститься.
Поэтому в подобных системах, когда зависание - частая ситуация, применяют процессы, и управляют ими через какой-либо вариант IPC. Пример такой системы - браузер, где каждая вкладка - отдельный процесс, именно из-за угрозы зависания. Добавлено через 41 секунду Вариантов достаточно. Пункт 4) как раз об этом.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
12.01.2020, 22:51 [ТС] | 34 |
В ваших словах много правды, но я стремлюсь сделать обёртку которая будет убивать поток всегда, при любых обстоятельствах.
4й пункт не годиться потомучто неизвестно где поток зависнет. Я рассматриваю обёртку над std::thread как свой маленький sdk, поэтому мне надо чтоб он был универсален и надёжен.
0
|
19410 / 10029 / 2443
Регистрация: 30.01.2014
Сообщений: 17,682
|
|
12.01.2020, 22:58 | 35 |
Ну и что? Вы включаете асинхронное прерывание в самом начале и дальше уже без разницы где он завис.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||||||
13.01.2020, 00:40 [ТС] | 36 | |||||
С неменьшим успехом поток может узнать свой tid и сообщить его наружу, чтобы в плохой ситуации деструктор обёртки вызвал tgkill. Тут вопрос "торга" какое решение лучше. Оба решение имеют свои prons & cons.
Добавлено через 1 час 20 минут Не могу понять в чём дело. В рабочем коде интегрировал 4й вариант. Но после вызова имею:
0
|
19410 / 10029 / 2443
Регистрация: 30.01.2014
Сообщений: 17,682
|
|
13.01.2020, 00:48 | 37 |
squareroot, покажите как вызывается pthread_setcanceltype у вас.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||||||
13.01.2020, 00:55 [ТС] | 38 | |||||
Добавлено через 3 минуты А, всё дошло. Я думал функция выдалет память под олдтайп.
0
|
19410 / 10029 / 2443
Регистрация: 30.01.2014
Сообщений: 17,682
|
||||||
13.01.2020, 00:55 | 39 | |||||
squareroot,
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||||||
13.01.2020, 01:24 [ТС] | 40 | |||||
DrOffset, Я правильно понимаю что нижеследущий код означает, что pthread_cancel может привести к краху приложения, если он будет вызван в момент работы обработчика исключения процедуры потока ?
0
|
13.01.2020, 01:24 | ||||||
Помогаю со студенческими работами здесь
40
Не понимаю из-за чего выскакивает: terminate called after throwing instance of std bad_alloc Terminate called after throwing an instance of 'int' Aborted -Ошибка, как быть? Ошибка при повторном запуске: terminate called after throwing an instance of 'std::ios_base::failure' Ошибка при выполнении запроса к mysql (terminate called after throwing an instance of 'sql::SQLException')
Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
![]() |
Новые блоги и статьи
![]() |
||||
Kafka или Pulsar: Что лучше для потоковой обработки в Java
Javaican 14.03.2025
Среди множества решений для потоковой обработки данных Apache Kafka долгое время удерживала лидирующие позиции, став де-факто стандартом в индустрии. Однако в последние годы всё больше внимания. . .
|
Создание и использование компонентов в Vue 3
Reangularity 14.03.2025
Компонент в Vue - это автономный блок интерфейса, который содержит собственную разметку, логику и стили. Представьте себе кнопку, форму ввода или даже целую панель навигации - всё это можно оформить. . .
|
Vue 3: Создаем современное веб-приложение с Composition API
Reangularity 14.03.2025
В фронтенд-разработке Vue 3 выделяется своим прагматичным подходом. В отличие от React с его минималистичной философией "всё — JavaScript" или Angular с его всеобъемлющим корпоративным подходом, Vue. . .
|
Разработка контекстных меню в iOS
mobDevWorks 14.03.2025
С приходом iOS 13 Apple представила новый API для контекстных меню, который полностью заменил предыдущую технологию 3D Touch peek & pop. Хотя многие разработчики и пользователи испытывают ностальгию. . .
|
Лучшие практики оптимизации Docker Image
Mr. Docker 13.03.2025
Размер Docker-образа влияет на множество аспектов работы с контейнерами. Чем больше образ, тем дольше его загрузка в реестр и выгрузка из него. Для команд разработки, работающих с CI/ CD пайплайнами,. . .
|
Вопросы на собеседовании по Docker
Mr. Docker 13.03.2025
Ты сидишь напротив технического специалиста, и вдруг звучит вопрос про Docker Swarm или многоэтапные сборки. Пот на лбу? Не переживай, после этой статьи ты будешь готов ко всему! Эта статья будет. . .
|
Поиск текста в сносках : замена дефиса на тире или тире на дефис...
РоΜа 13.03.2025
Нужно было найти текст в сносках и заменить. Почему-то метод селекшн не сработал. . . пришлось гуглить. найденный на форумвба код пришлось править. Смысл - заменяет в сносках дефисы и тире на нужные. . . .
|
Real PATH definitions in bash scripts
jigi33 13.03.2025
Как поймать путь и путь к директории относительно запускаемого файла в BASH
1. поймать путь через вывод $(pwd)
2. более правильно - на основе realpath (см. скриншот)
|
Django или Flask: что выбрать для веб-разработки на Python
py-thonny 13.03.2025
Django – это высокоуровневый фреймворк, который придерживается философии "всё включено". Он предоставляет разработчику готовые решения для большинства типичных задач веб-разработки: от аутентификации. . .
|
Непрерывное развертывание в Java с Kubernetes
Javaican 13.03.2025
Чем так привлекателен Kubernetes для развертывания Java-приложений? Этот оркестратор контейнеров позволяет автоматизировать развертывание, масштабирование и управление контейнеризированными. . .
|