web-dev-qa-db-ja.com

Android NDK?のpthread_cancel()の代替

中規模のC++コードをAndroid NDKに移植しています。残念ながら、pthreadsの実装(とにかくNDK v5以降)は不完全です。具体的には、アプリケーションはpthread_cancel()に依存して強制終了します。ワーカースレッド。NDKはpthread_cancel()を実装していません!ワーカースレッドが正常に応答している場合は他にも明らかな答えがありますが、ワーカースレッドが応答していない場合(無限ループなど)、全体を強制終了せずにキャンセルするにはどうすればよいですか?処理する?

21
Chuck Fry

この男のために働く可能なオプション: http://igourd.blogspot.com/2009/05/work-around-on-pthreadcancel-for.html

次の場合に備えて、ここに再投稿します。

次に、pthread_killを使用してSIG_USR1シグナルをトリガーし、シグナルハンドラーを使用してこのpthreadを終了して試行しましたが、機能しますが、この種のメソッドに欠点があるかどうか疑問に思っています。

タイマーアウト:

if ( (status = pthread_kill(pthread_id, SIGUSR1)) != 0) 
{ 
    printf("Error cancelling thread %d, error = %d (%s)", pthread_id, status, strerror status));
} 

USR1ハンドラー:

struct sigaction actions;
memset(&actions, 0, sizeof(actions)); 
sigemptyset(&actions.sa_mask);
actions.sa_flags = 0; 
actions.sa_handler = thread_exit_handler;
rc = sigaction(SIGUSR1,&actions,NULL);
void thread_exit_handler(int sig)
{ 
    printf("this signal is %d \n", sig);
    pthread_exit(0);
}

最良の答えは、スレッドがIOを待機しないように書き直すことです。 http://groups.google.com/group/Android-platform/browse_thread/thread/0aad393da2da65b1

16

私はこれを処理する小さなライブラリを作成しました。

バイオニックスレッド構造の未使用ビットを利用します。

私はそれを呼んだ libbthread :)

楽しい ;)

0
tux_mind