Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 30.04.2010
Сообщений: 17

Убить thread, вызвавший ошибку

26.10.2011, 09:47. Показов 1841. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Есть ли способ убить thread, вызвавший FloatingPointException в multi-thread проекте, не убивая всю application ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.10.2011, 09:47
Ответы с готовыми решениями:

Почему когда фоновый thread "спит" я не могу убить main thread ?
Привет! Делаю гуй на swing'e, для реализации долговременной задачи создал второй поток. В этом втором потоке вызывается...

Как убить std::thread?
К сожалению мне так и не удалось найти информацию о том, как корректно убить std::thread в случае необходимости. Как правило, предлагают...

Как убить ошибку
LINK : fatal error LNK1146: no argument specified with option "/libpath:" - что за ошибка и что с ней делать?

16
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
26.10.2011, 10:20
Не понятно речь идет об пристрелить из самого приложения или из вне?
0
1 / 1 / 1
Регистрация: 30.04.2010
Сообщений: 17
26.10.2011, 10:28  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Не понятно речь идет об пристрелить из самого приложения или из вне?
есть, допустим, некий основной процесс (main_thread) и несколько обработчиков (handler_thread).
В процессе выполнения приложения в одном из handler_thread возникает исключение типа SIGSEGV или SIGFPE.
Нужно, чтобы эта нитка или сама себя кокнула или main_thread ее замочила (что еще лучше).

Есть мнение, что сделать этого нельзя - прочел на одно из буржуйских форумов мнение прогера из Дели.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
26.10.2011, 10:35
От чего нельзя то?
Делаете в этой нити обработчик соответствующего сигнала, который корректно освободит все ресурсы нити (например память, мьтексы и тп) и завершит нить. Перед выходом можно сигнализировать в main - я сдох, перезапусти.
0
1 / 1 / 1
Регистрация: 30.04.2010
Сообщений: 17
26.10.2011, 10:39  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
От чего нельзя то?
Делаете в этой нити обработчик соответствующего сигнала, который корректно освободит все ресурсы нити (например память, мьтексы и тп) и завершит нить. Перед выходом можно сигнализировать в main - я сдох, перезапусти.
пробовал. обработчик внутри нитки сигнал обрабатывает, но вся апликуха все равно завершается после этого


может подсобите куском правильного кода или ссылочкой ?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
26.10.2011, 11:25
Не готовым не поделюсь.
Имхо достаточно:
C
1
2
3
4
5
6
7
8
9
10
11
12
void
sig_handler(int sig)
{
        (void)sig;
 
        /* В обработчике вся эта хрень только для примера, лучше просто ставить флаг, а всю работы вынести в основной код. */
        if (pthread_mutex_trylock(&some_mutex))
                pthread_mutex_unlock(&some_mutex);
        pthread_t id = pthread_self();
        fprintf(stderr, "sig_handler pthread id: %ld\n", id);
        pthread_exit(0);
}
чтобы прибить нить, оставив живыми остальные
0
1 / 1 / 1
Регистрация: 30.04.2010
Сообщений: 17
26.10.2011, 11:32  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Не готовым не поделюсь.
Имхо достаточно:
C
1
2
3
4
5
6
7
8
9
10
11
12
void
sig_handler(int sig)
{
        (void)sig;
 
        /* В обработчике вся эта хрень только для примера, лучше просто ставить флаг, а всю работы вынести в основной код. */
        if (pthread_mutex_trylock(&some_mutex))
                pthread_mutex_unlock(&some_mutex);
        pthread_t id = pthread_self();
        fprintf(stderr, "sig_handler pthread id: %ld\n", id);
        pthread_exit(0);
}
чтобы прибить нить, оставив живыми остальные
мда... тут какбы и нет ответа на вопрос
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
26.10.2011, 11:35
Так уневерсального готового решения на все случаии жизни и быть не может.
А тот же pthread_exit(0) в обработчике завершит только нужную нить. Чем не устраивает?
0
1 / 1 / 1
Регистрация: 30.04.2010
Сообщений: 17
26.10.2011, 11:40  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Так уневерсального готового решения на все случаии жизни и быть не может.
А тот же pthread_exit(0) в обработчике завершит только нужную нить. Чем не устраивает?

чуть выше я написал, что после вызова pthread_exit() в сбойной нитке весь процесс завершается с сообщением "Аварийный останов" (то есть вероятно вызовом abort())
проблема в этом
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
26.10.2011, 11:42
Тогда Вам нужно искать кто делает это abort() или тупо ловить SIGABRT
0
1 / 1 / 1
Регистрация: 30.04.2010
Сообщений: 17
26.10.2011, 11:56  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Тогда Вам нужно искать кто делает это abort() или тупо ловить SIGABRT
abort() - default action для FPE (согласно ману)
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
26.10.2011, 13:10
Вы всетаки определитесь по какому сигналу дохнет ваш код (man wait например) и обрабатывайте его.

Добавлено через 1 час 0 минут
Во, накорябал кривенький пример ловли abort().
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <sys/types.h>
#include <pthread.h>
#include <setjmp.h>
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
jmp_buf jb;
sig_atomic_t    got_sig = 0;
 
void
sighandler(int  sig)
{
        printf("got signal %d\n", sig);
        got_sig = 1;
        longjmp(jb, 1);
}
 
void *
good(void *arg)
{
        (void)arg;
 
        while (1) {
                printf("good\n");
                sleep(1);
        }
        return (NULL);
}
 
void *
bad(void *arg)
{
        struct sigaction        act;
        int                     i = 0;
        (void)arg;
 
        memset(&act, 0, sizeof(act));
        act.sa_handler = sighandler;
        sigemptyset(&act.sa_mask);
        sigaction(SIGABRT, &act, NULL);
        setjmp(jb);
 
        while (got_sig == 0) {
                if (++i == 5)
                        abort();
                else
                        printf("bad\n");
                sleep(1);
        }
        printf("bad exiting\n");
 
        return (NULL);
}
 
int
main(void)
{
        pthread_t       tid;
 
        pthread_create(&tid, NULL, good, NULL);
        pthread_create(&tid, NULL, bad, NULL);
 
        sleep(10);
        return 0;
}
1
1 / 1 / 1
Регистрация: 30.04.2010
Сообщений: 17
26.10.2011, 13:15  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Вы всетаки определитесь по какому сигналу дохнет ваш код (man wait например) и обрабатывайте его.

Добавлено через 1 час 0 минут
Во, накорябал кривенький пример ловли abort().
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <sys/types.h>
#include <pthread.h>
#include <setjmp.h>
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
jmp_buf jb;
sig_atomic_t    got_sig = 0;
 
void
sighandler(int  sig)
{
        printf("got signal %d\n", sig);
        got_sig = 1;
        longjmp(jb, 1);
}
 
void *
good(void *arg)
{
        (void)arg;
 
        while (1) {
                printf("good\n");
                sleep(1);
        }
        return (NULL);
}
 
void *
bad(void *arg)
{
        struct sigaction        act;
        int                     i = 0;
        (void)arg;
 
        memset(&act, 0, sizeof(act));
        act.sa_handler = sighandler;
        sigemptyset(&act.sa_mask);
        sigaction(SIGABRT, &act, NULL);
        setjmp(jb);
 
        while (got_sig == 0) {
                if (++i == 5)
                        abort();
                else
                        printf("bad\n");
                sleep(1);
        }
        printf("bad exiting\n");
 
        return (NULL);
}
 
int
main(void)
{
        pthread_t       tid;
 
        pthread_create(&tid, NULL, good, NULL);
        pthread_create(&tid, NULL, bad, NULL);
 
        sleep(10);
        return 0;
}
Ага, спасибо!
Примерно также решил проблему.
Работает

P.S. без jmp
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
26.10.2011, 13:18
Цитата Сообщение от Crenth Посмотреть сообщение
Примерно также решил проблему.
Если без джампа, то расскажите пожалуйста.
0
1 / 1 / 1
Регистрация: 30.04.2010
Сообщений: 17
26.10.2011, 13:25  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Если без джампа, то расскажите пожалуйста.

в моем случае bad_thread находится в суспенде в мутексе. поэтому нет возможности проанализировать сигнал, если он возник.
в sighandler делаю backtrace (для разбора полетов), а затем вызываю pthread_exit.
как мне кажется, вполне рабочий метод, поскольку в bad_thread нет неавтоматических переменных - память не нужно освобождать вручную.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
26.10.2011, 13:33
Ясно) А я по предыдущим постам почему то решил, что pthread_exit() Вам не приемлем, и удивился как еще можно не завершать обработчик сигнала.
0
1 / 1 / 1
Регистрация: 30.04.2010
Сообщений: 17
26.10.2011, 13:38  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Ясно) А я по предыдущим постам почему то решил, что pthread_exit() Вам не приемлем, и удивился как еще можно не завершать обработчик сигнала.
наверное, я неточно сформулировал проблему. учту.
Спасибо за помощь.
Хотя и сам пришел к этому решению, но уверен, что не без вашей помощи.
Что еще раз доказывает, что Мысль материальна
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.10.2011, 13:38
Помогаю со студенческими работами здесь

Ссылка на объект, вызвавший событие
Всем доброго времени суток! Недавно начал изучать JavaScript и пишу свой первый калькулятор. Возникла необходимость при нажатии на...

Получить класс, вызвавший метод
Вопрос из серии сам не знаю что сказал! :) Гуру посоветуйте! Есть свой клас-обверта для Log.i(); Назвал...

Как выбрать обьект вызвавший событие?
У меня есть div с объектами стиля class в нем. (Их много и каждому давать свой div не вариант.) Каждый объект вызывает событие (например...

Сессию нужно убить memberid нужно принудительно убить и страницы... как ?
&lt;SCRIPT LANGUAGE=VBScript RUNAT=Server&gt; SUB Session_OnStart Session.Timeout = 3 Application.lock Application('visitors') =...

Непонятки в Java. Chain method call. Thread.start() vs Thread.run()
Ребят, кто знает подскажите, изучаю Java уже 4 месяца, а до меня все не доходит вот к примеру такая запись, ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru