приложение iOS аварийно завершает работу с приложением EXC_BAD_ACCESS на глобальных / статических переменных

В моем приложении iOS я получаю сбой EXC_BAD_ACCESS на одной из глобальных переменных, которые я использую в своем коде C/C++, когда приложение завершается. Обратите внимание, что приложение не помещается в фоновом режиме, но завершается при закрытии приложения, указав не запускать в фоновом режиме в файле info plist.

Ниже приведен связанный код.

#include "chromium/threading/thread_local.h"
#include "libev/ev.c"

namespace simplegetter {


ThreadLocalPointer<ev_io> threadLocal_sock_watcher;
ThreadLocalPointer<ev_timer> threadLocal_timer;


void start_get (my_get_struct* get_struct) {

    ev_io* sock = new ev_io;
    ev_timer* temp_timer = new ev_timer;

    threadLocal_sock_watcher.Set(sock);
    threadLocal_timer.Set(temp_timer);

    //... other code.. 

}

void fire_again(my_get_struct* get_struct, uint32_t rtt) {
    double repeat = get_client_repeat_value(rtt);
    if (repeat < 0.5) repeat = 0.5;
    threadLocal_timer.Get()->repeat = repeat;
    get_struct->prev_timeout_finish_time = CURRENT_TIME_MS;
    ev_timer_again( threadLocalLoop.Get(), threadLocal_timer.Get());

    //.. other code
}

//... other code 

};

threadLocal_timerглобальная переменная, о которой я говорю. метод start_get вызывается в новом потоке для извлечения сетевого ресурса. Метод fire_again вызывается несколько раз в потоке, который вызвал метод start_get, пока операция не будет завершена.

Теперь проблема в том, о прекращении приложения (i.e когда iOS отправляет вызов exit () на главном потоке.. (это связано с тем, что приложение не должно оставаться в подвешенном состоянии или работать в фоновом режиме), iOS, похоже, освобождает глобальную переменную i.e threadLocal_timer в этом случае, который приводит к сбою EXC_BAD_ACCESS в моем коде в строке:

threadLocal_timer.Get()->repeat = repeat;

Таким образом, глобальная переменная освобождается iOS до того, как поток будет остановлен при завершении приложения. Мой вопрос в том, есть ли какое-либо решение о том, как я могу справиться с этим сбоем, кроме того, что не использовать статические или глобальные переменные вообще в вышеуказанном коде?

1 ответ

  1. Ваш вопрос слишком расплывчат.

    Я написал приложения, которые имеют длительные фоновые процессы, которые зависят от глобальных ресурсов, как вы описываете.

    То, что я сделал, было иметь глобальный подсчет фоновых задач. Каждый раз, когда я запускал одну из этих длительных задач, я вызывал функцию в главном потоке, которая увеличивала количество задач.

    В самом конце кода завершения работы для длительных задач я вызываю другую функцию (в главном потоке), которая уменьшает счетчик.

    В коде, который уменьшает количество потоков, если число достигает нуля, я освобождаю и обнуляю свои глобальные ресурсы.

    С этой логикой Глобальные ресурсы не освобождаются до тех пор, пока с ними не будет выполнен последний фоновый поток.

    Такой подход, вероятно, сработал бы для вашей проблемы, но я не могу быть более конкретным, не зная больше об этом.