Size: a a a

Android NDK (C++) — русскоговорящее сообщество

2020 March 28

=

= А| Г | Е | Н | С | Т | В | О = in Android NDK (C++) — русскоговорящее сообщество
Понял
Спс
источник

=

= А| Г | Е | Н | С | Т | В | О = in Android NDK (C++) — русскоговорящее сообщество
Надеюсь не убью тел)
источник
2020 March 29

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
Ребят, убиваю тред с другого треда такой командой
if(pthread_kill(Ox496, SIGUSR1) == 0)Ox497 = 0;
Все отлично работало, но недавно начал замечать что в  логах есть предупреждения "W/libc: invalid pthread_t (0) passed to pthread_kill", а сейчас уже и падения
A/libc: invalid pthread_t 0x71fc4e5d50 passed to pthread_join A/libc: Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 29192.
В исходниках нашел причину, последний абзац.
https://github.com/aosp-mirror/platform_bionic/blob/master/libc/bionic/pthread_internal.cpp#L129

Если проверять pthread_t существует ли он, то это просто указатель, поэтому null он не вернет. Вопрос, как правильно завершать pthread_t  из другого треда?
источник

o

oles in Android NDK (C++) — русскоговорящее сообщество
0x1de
Ребят, убиваю тред с другого треда такой командой
if(pthread_kill(Ox496, SIGUSR1) == 0)Ox497 = 0;
Все отлично работало, но недавно начал замечать что в  логах есть предупреждения "W/libc: invalid pthread_t (0) passed to pthread_kill", а сейчас уже и падения
A/libc: invalid pthread_t 0x71fc4e5d50 passed to pthread_join A/libc: Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 29192.
В исходниках нашел причину, последний абзац.
https://github.com/aosp-mirror/platform_bionic/blob/master/libc/bionic/pthread_internal.cpp#L129

Если проверять pthread_t существует ли он, то это просто указатель, поэтому null он не вернет. Вопрос, как правильно завершать pthread_t  из другого треда?
правильно посылать сообщение о том что пора завершаться
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
oles
правильно посылать сообщение о том что пора завершаться
Каким образом?
источник

o

oles in Android NDK (C++) — русскоговорящее сообщество
0x1de
Каким образом?
через семафор например
источник

o

oles in Android NDK (C++) — русскоговорящее сообщество
ну или флаг какойнить
источник

o

oles in Android NDK (C++) — русскоговорящее сообщество
зависит от реализации
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
static void handler(int signum){
   pthread_exit(NULL);
}
void *native_thread_start_2(void* argp ) {
   static sigset_t mask;
   sigemptyset(&mask);
   sigaddset(&mask, SIGUSR1);
while(flag){
sleep(300)
}
   pthread_join(thread, (void**)NULL);

}
Так запускаю
pthread_create(&thread, NULL, native_thread_start_2, args);
так убиваю
if(pthread_kill(thread, SIGUSR1) == 0){
printf('killed')
}
источник

o

oles in Android NDK (C++) — русскоговорящее сообщество
все зависит от того что делает твой native_thread_start_2
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
какая разница, там цикл висит
источник

o

oles in Android NDK (C++) — русскоговорящее сообщество
большая, если он сам может понять что пора выходить то и сообщений никаких не надо
источник

o

oles in Android NDK (C++) — русскоговорящее сообщество
если это обраотчик очереди то ему можно выставить флаг который скажет что пора выходить
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
oles
большая, если он сам может понять что пора выходить то и сообщений никаких не надо
не может, поэтому и пришлось делать так. Флаг в цикле даже если менять, периоды большие. Этот вариант используется как запасной

if(pthread_kill(thread, SIGUSR1) == 0){
printf('killed')
flag = 0;
}
источник

o

oles in Android NDK (C++) — русскоговорящее сообщество
а что в цикле происходит?
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
там 8 тредов, у каждого долгие задачи в очереди. В некоторых взаимодействие с java, в некоторых висят проверки статусов.
лет 5  нормально работало, в libc изменения после 26 апи внедрили теперь такие дела. Сейчас на 10ке тестирую в логах предупреждения, один раз нарвался на ошибку (см выше)
источник

o

oles in Android NDK (C++) — русскоговорящее сообщество
если долгие задачи которые могут повиснуть по возможности надо делать таймаут на ожидании евента а дальше в цикле проверка флага
источник

:

:FailuRe: in Android NDK (C++) — русскоговорящее сообщество
Кто знает как реверсить?
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
oles
если долгие задачи которые могут повиснуть по возможности надо делать таймаут на ожидании евента а дальше в цикле проверка флага
и так то стоят таймауты и в цикле проверяю, но это не надежное решение, бывает параллельно несколько одинаковых тредов запускается, поэтому этот вариант с флагом использую как подстраховочный, основной с pthread_kill.
источник

o

oles in Android NDK (C++) — русскоговорящее сообщество
0x1de
и так то стоят таймауты и в цикле проверяю, но это не надежное решение, бывает параллельно несколько одинаковых тредов запускается, поэтому этот вариант с флагом использую как подстраховочный, основной с pthread_kill.
как это ненадежное а семафоры на что?
источник