|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||||||
Terminate called without an active exception12.01.2020, 17:16. Показов 33599. Ответов 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'
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|
| 13.01.2020, 09:58 | |
|
squareroot, на самом деле мне кажется я выше дал ясно понять, что ни PTHREAD_CANCEL_ASYNCHRONOUS на общих основаниях, ни tgkill, ни TerminateThread - не являются теми решениями, которые можно назвать хорошими.
Т.е. еще более прямо, если вы будете их централизованно использовать - вы никогда не получите стабильное приложение. Особенно в С++. PTHREAD_CANCEL_ASYNCHRONOUS из всего этого является самым мягким решением, потому что позволяет указать область, где прерывание в произвольном месте делать безопасно. Ваш код не работает скорее всего из-за того, что cancel в современном Linux реализуется через бросок исключения.
0
|
|
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||
| 13.01.2020, 14:33 [ТС] | |||
|
Решение должно решать поставленную задачу - завершать исполнение потока без завершения приложения. Как вы считаете, стоит попробовать вариант с tgkill или я могу столкнуться с анологичными побочными эффектами ? И если стоит, то как его лучше реализовать ? Обязательно ли "пробрсывать" tid из нутри в наружу.
0
|
|||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||||
| 13.01.2020, 14:49 | ||||
|
Единственный надежный вариант, при условии вероятности зависания - это отказаться от потоков. Добавлено через 6 минут
0
|
||||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||||
| 13.01.2020, 15:36 [ТС] | |||||
|
Я даже сам писал что тут вопрос торга. Добавлено через 17 минут DrOffset, Я больше склоняюсь к варианту с tgkill, чем к pthread_cancel потомучто если выдвигать требования к процедуре потока, либо не аллоцировать ресурсы динамически, либо не использовать обработчики исключений, то первый вариант создаёт меньше проблем при разработке процедуры потока. Вы так не считаете ? Все необходимые ресурсы можно выделить заранее или вести их учёт из основного потока. Добавлено через 11 минут И ещё непонятно, tgkill, оно вроде не посиксовый. POSIX не даёт инструментов уничтожения потока ? Добавлено через 3 минуты Если дело обстоит именно так, то pthread_cancel можно оставить в качестве говядины второй свежести для нелинуксовых посикс систем.
0
|
|||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||||
| 13.01.2020, 17:33 | |||||
|
Добавлено через 45 секунд Добавлено через 1 минуту ![]() Добавлено через 6 минут С конкретно мьютексом все еще проще, он может остаться в нормальном, но залоченном состоянии. Но снаружи вы никак об этом не узнаете. По большом счету вы даже разлочить его не сможете, потому что делать это должен тот же поток, который вызывал lock. А потока этого уже нет. Добавлено через 3 минуты Самое страшное во всем этом: вы можете долгое время не видеть ошибки вообще. Т.е. все как-то так будет складываться, что сброс потока не будет иметь последствий. Это ни что иное, как мина замедленного действия, старательно заложенная вами самим.
0
|
|||||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||
| 13.01.2020, 17:39 [ТС] | ||
А кто нам мешаем "запилить" обработчик сигнала SGKILL для потока в качестве сапёра?
0
|
||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||||||
| 13.01.2020, 17:44 | |||||||
|
Например у вас в потоке вот такая функция выполняется, где-нибудь в цикле:
0
|
|||||||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||
| 13.01.2020, 17:55 [ТС] | ||
|
Как разруливать ситуацию и в каком потоке определяется спецификой конкретного приложения. Задача обёртки - проинформировать. Но если никто не мониторит ситуацию аварийного завершения потока, значит заблоченный мьютекс при принудительном завершении потока разработчика конечного приложения не волнует.
0
|
||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||||||
| 13.01.2020, 17:58 | ||||||
|
squareroot, вы видимо не поняли, что даже если разработчика волнует залоченный мьютекс - у него нет средств определить нужно ли его разлочить или не нужно.
В этом обработчике не будет никакой возможности узнать, где именно прервали поток
0
|
||||||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
| 13.01.2020, 18:04 [ТС] | |
|
0
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||||
| 13.01.2020, 18:12 | ||||
![]() Ну не пишите уж откровенные-то глупости. Допустим try_lock - он работает, потому что мьютекс в коректном залоченном состоянии. Дальше что? Он будет долбиться в него бесконечно, потом unlock имеет право делать только поток, вызвавший lock. Я уж не говорю, про неизвестное, "промежуточное" состояние, когда поток прервали посреди работы функции lock. Вот цитаты из документации Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
Это пустой звук для вас?
0
|
||||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
| 13.01.2020, 18:15 [ТС] | |
|
DrOffset, вообще говоря наиболее ожидаемое поведение при принудительном завершении потока это завершение приложения, но не аварийное завершение как в случае pthread_cancel и catch(...) {} а нормальное, с сохранием в логах ошибки из-за которой завершается приложение. Но наверно есть способ справится с залоченным мьютексом системными средствами, если разработчик конечного приложения сделает восстановления после сбоя без завершения приложения.
0
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||
| 13.01.2020, 18:22 | ||
|
Таких ситуаций множество, некоторые можно решить, некоторые нет. Самое страшное, что неизвестно как решать. Было бы гораздо проще, если бы программа точно знала что она делала до завершения. Но знать это нельзя в общем случае, о чем красноречиво пишут в документации.
0
|
||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||
| 13.01.2020, 18:46 [ТС] | |||
|
Даже если допустим поток испльзует сокет и он останется в неизвестном состоянии после завершения потока. Всегда можно спросить файловые хендлы у ОС для данного процесса и по тихому закрыть, те что стали "зомби."
0
|
|||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||
| 13.01.2020, 19:18 | |||
|
А вот вам, раз уж вы пишете SDK - не позволительно слишком оптимистично к этому относиться. Так что смотрите. Добавлено через 17 минут Вообще говоря, я уже проходил ваш путь (только без помощи форумов). Т.е. я исследовал возможности построить стабильную систему с произвольным кодом внутри потоков, с возможностью остановки потоков в случае проблем. Так вот, со всей ответственностью заявляю: в построить такую систему на потоках - нельзя. В частном случае - можно. В общем - нельзя. Собственно я не знаю, для какой задачи вы это пишете. Если для себя, вы, конечно же можете и не узнать о всем спектре проблем. Если для серьезного продакшена, то проблемы возникнут очень скоро. Так что, вы можете, конечно, учиться на своих ошибках, но лучше это делать на чужих.
0
|
|||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||||||
| 13.01.2020, 19:40 [ТС] | |||||||
|
DrOffset, У меня щас недостаточно знаний и опыта чтобы сделать грамотно на уровне процессов, а халтуру делать нехочу и не хочется на этом сильтно зацикливоться.
Завершение потока у меня не получается:
В документации сказано: http://man7.org/linux/man-page... ill.3.html
Добавлено через 9 минут Завершается процесс, а не поток.
0
|
|||||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||
| 13.01.2020, 20:50 | ||
|
<в примере ошибка, поторопился>
Добавлено через 35 минут
0
|
||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||
| 13.01.2020, 23:18 [ТС] | ||
|
Добавлено через 45 минут А впрочем я нашёл ответ, что после форка, только один поток остаётся в новом процессе. Выходит поток убить можно через процесс клонирование процесса
0
|
||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||
| 13.01.2020, 23:20 | ||
|
Для того, чтобы продублировать все потоки есть системный вызов forkall, но я его встречал только в Solaris.
0
|
||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||||||
| 14.01.2020, 01:15 [ТС] | |||||||
|
DrOffset, А покакой причине санитайзер после форка детектирует утечку памяти ?
Если форк не делать, то санитайзер утечку не фиксирует.
0
|
|||||||
| 14.01.2020, 01:15 | |
|
Не понимаю из-за чего выскакивает: 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')
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|