在我的iOS应用程序中,当应用程序终止时,我在我的C / C ++代码中使用的一个全局变量上出现 EXC_BAD_ACCESS 崩溃。请注意,应用程序不会被置于后台,但是在关闭应用程序时会通过指定不在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 方法的线程上多次调用,直到操作完成。
现在的问题是,在应用程序终止时(即当iOS在主线程上发送一个exit()调用时...(这是因为应用程序不应该保持挂起状态或在后台运行),iOS似乎在这种情况下释放全局变量即threadLocal_timer,导致我的代码中的 EXC_BAD_ACCESS 崩溃:
threadLocal_timer.Get()->repeat = repeat;
因此,在终止应用程序时线程停止之前,全局变量是由iOS发布。我的问题是,除了在上面的代码中根本不使用静态变量或全局变量之外,有什么解决方法可以解决这个崩溃吗?
答案 0 :(得分:0)
你的问题太模糊了。
我编写的应用程序具有长期运行的后台进程,这些进程依赖于全局资源,就像您描述的那样。
我所做的是拥有全局后台任务。每次我启动其中一个长时间运行的任务时,我在主线程上调用了一个增加任务计数的函数。
在长时间运行的任务的关闭代码的最后,我调用另一个递减计数器的函数(在主线程上)。)
在减少线程数的代码中,如果计数达到零,我会释放并取消全局资源。
使用该逻辑,在完成最后一个后台线程之前,不会释放全局资源。
这样的方法可能会对你的问题有所帮助,但我不能在不了解更多信息的情况下更加具体。