【发布时间】:2014-07-22 15:29:29
【问题描述】:
在你告诉我不应该杀死线程而是发送一个信号/设置一个标志让它们做出反应之前,让我解释一下场景:
我正在使用 OpenSL API(播放本地 mp3 文件)在 Android NDK 中开发音频播放器,但 Android 实现有一个错误,如果我对文件重复执行查找操作,线程不幸挂起当我尝试释放资源时出现内部死锁(SLObjectItf->Destroy)。
所以我将销毁例程移至子线程并等待固定的时间使其完成,如果没有,我认为线程已挂起并继续执行泄漏一些资源,这比拥有更好转到系统设置并手动终止应用程序。
我尝试使用信号 SIGTERM 和 SIGKILL 通过 pthread_kill 终止子线程,但似乎两者都在终止我的整个应用程序并且 Android 重新启动它。我无法使用 pthread_cancel,因为线程已挂起,而且 Android NDK 不支持该方法。
有什么方法可以在不杀死整个应用的情况下杀死子线程?
编辑:这是线程和启动它的代码
static void *destroyDecoderInBackground(void *ignoredArgument)
{
if (decoderObject != NULL)
{
__android_log_print(ANDROID_LOG_INFO, "OpenSLES", "Destroying decoder object");
(*decoderObject)->Destroy(decoderObject);
__android_log_print(ANDROID_LOG_INFO, "OpenSLES", "Decoder object destroyed");
decoderObject = NULL;
decoderPlay = NULL;
decoderSeek = NULL;
decoderBufferQueue = NULL;
}
pthread_mutex_lock(&destroyDecoderLock);
pthread_cond_signal(&destroyDecoderCond);
pthread_mutex_unlock(&destroyDecoderLock);
pthread_exit(0);
}
static void destroyDecoder(JNIEnv* env)
{
logJava("Trying to destroy decoder");
struct timespec timeToWait;
struct timeval now;
// get absolute future time to wait
clock_gettime(CLOCK_REALTIME, &timeToWait);
timeToWait.tv_nsec = timeToWait.tv_nsec + (500 * 1000000);
// wait for destroy decoder thread to complete
pthread_mutex_lock(&destroyDecoderLock);
pthread_create(&destroyDecoderThread, NULL, &destroyDecoderInBackground, NULL);
logJava("Starting waiting");
pthread_cond_timedwait(&destroyDecoderCond, &destroyDecoderLock, &timeToWait);
pthread_mutex_unlock(&destroyDecoderLock);
logJava("Finished waiting");
if(decoderObject != NULL)
{
logJava("Destroy decoder hanged, killing thread, resources will leak!!!");
pthread_kill(destroyDecoderThread, SIGTERM);
decoderObject = NULL;
decoderPlay = NULL;
decoderSeek = NULL;
decoderBufferQueue = NULL;
}
}
【问题讨论】:
-
你能发布一些代码吗?也许是 start_routine?
-
pthread_kill(destroyDecoderThread, SIGTERM);它应该只杀死你提到的线程!
标签: android c multithreading android-ndk