|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||||||
Terminate called without an active exception12.01.2020, 17:16. Показов 33244. Ответов 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'
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|
| 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
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||
| 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
|
|||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||
| 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
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||||
| 13.01.2020, 17:44 | |||||||
|
Например у вас в потоке вот такая функция выполняется, где-нибудь в цикле:
0
|
|||||||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||
| 13.01.2020, 17:55 [ТС] | ||
|
Как разруливать ситуацию и в каком потоке определяется спецификой конкретного приложения. Задача обёртки - проинформировать. Но если никто не мониторит ситуацию аварийного завершения потока, значит заблоченный мьютекс при принудительном завершении потока разработчика конечного приложения не волнует.
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||
| 13.01.2020, 17:58 | ||||||
|
squareroot, вы видимо не поняли, что даже если разработчика волнует залоченный мьютекс - у него нет средств определить нужно ли его разлочить или не нужно.
В этом обработчике не будет никакой возможности узнать, где именно прервали поток
0
|
||||||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
| 13.01.2020, 18:04 [ТС] | |
|
0
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||
| 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
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 13.01.2020, 18:22 | ||
|
Таких ситуаций множество, некоторые можно решить, некоторые нет. Самое страшное, что неизвестно как решать. Было бы гораздо проще, если бы программа точно знала что она делала до завершения. Но знать это нельзя в общем случае, о чем красноречиво пишут в документации.
0
|
||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||
| 13.01.2020, 18:46 [ТС] | |||
|
Даже если допустим поток испльзует сокет и он останется в неизвестном состоянии после завершения потока. Всегда можно спросить файловые хендлы у ОС для данного процесса и по тихому закрыть, те что стали "зомби."
0
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||
| 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
|
|||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 13.01.2020, 20:50 | ||
|
<в примере ошибка, поторопился>
Добавлено через 35 минут
0
|
||
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||
| 13.01.2020, 23:18 [ТС] | ||
|
Добавлено через 45 минут А впрочем я нашёл ответ, что после форка, только один поток остаётся в новом процессе. Выходит поток убить можно через процесс клонирование процесса
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 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')
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2.
Задача: контроль уникальности строк в. . .
|
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
|
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
|
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
|
|
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
|
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
|
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока
Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
|
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов
• Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp
• Смежный проект:. . .
|