2016-05-27 35 views
0

、私はアプリが終了したとき、私は私のC/C++コードで使用グローバル変数の1にEXC_BAD_ACCESSクラッシュを取得しています。アプリはバックグラウンドにはされませんが、情報plistファイルでバックグラウンドで実行しないように指定することでアプリを終了する際に終了します。iOSアプリがクラッシュし、私のiOSアプリケーションで

次の関連コードが..です

#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はラインで私のコードでクラッシュEXC_BAD_ACCESSにつながるこの場合にはグローバル変数すなわちthreadLocal_timerをオフにリリースされる:スレッドが停止する前に

threadLocal_timer.Get()->repeat = repeat; 

ので、グローバル変数は、iOSによって解放ですアプリの終了時に。私の質問は、私は静的またはグローバルを使用してから離れてこのクラッシュに対処する方法については何か解決策はありますか?上記のコードですべてariables?

+0

どのようなライブラリ、どのような変数ですか?申し訳ありませんが、私たちは千歳です。 – SergeyA

+0

@SergeyAこのC/C++ライブラリは、コード内に静的変数とグローバル変数を持つ内部ライブラリです。 ex:ev_timerは、EXC_BAD_ACCESSクラッシュがあるグローバル変数の1つです – Ravi

+0

いいえ、明確ではありません。私たちはあなたのライブラリ内で何が起こっているのか分かりません。 – SergeyA

答えて

0

あなたの質問はあまりにも曖昧です。

私はあなたと同じように、グローバルリソースに依存する長期実行のバックグラウンドプロセスを持つアプリケーションを作成しました。

私がしたことは、グローバルバックグラウンドタスクカウントを持つことでした。私がこれらの長時間実行するタスクの1つを開始するたびに、タスク数を増やしたメインスレッド上の関数を呼び出しました。スレッドカウントをデクリメントコードで長時間実行中のタスクの停止コードの最後に

、私はカウンタをデクリメント(メインスレッド上の)別の関数を呼び出します。)

、もしカウントがゼロになると、グローバルリソースを割り当て解除して除外します。

このロジックでは、グローバルリソースは、最後のバックグラウンドスレッドが完了するまで解放されません。

このようなアプローチはおそらくあなたの問題には役立ちますが、詳細を知ることなく具体的​​にすることはできません。

+0

私は自分の質問を編集し、関連コードを掲示しました。私の問題は、iOSがこれらの変数を使用するスレッドを停止する前に使用したグローバル変数を解放することです。私がまだ不明な場合は教えてください。答えに気をつけてくれてありがとう。 – Ravi

関連する問題