NDK c ++ std :: thread abort在连接时崩溃

时间:2017-02-06 11:29:16

标签: android c++ multithreading c++11 android-ndk

首先,我没有先前的C知识。我试图把一个线程放在一起。这是我的例子。我首先调用start,然后在java方面做一些工作之后我调用stop

#include <jni.h>
#include <thread>
std::thread LOOPING_THREAD;
bool do_job = false;

//looping func
 void looping(int test) {
   while (do_job) {
    LOGD("Doing job");
   }
}

//start
JNIEXPORT jint JNICALL
Java_com_example_start(JNIEnv *env, jobject thiz,) {
LOOPING_THREAD = std::thread(looping, 1);
}

JNIEXPORT jint JNICALL
Java_com_example_stop(JNIEnv *env, jobject thiz) {
do_job= false;
LOOPING_THREAD.join();
return 0;
  }

  }

上面通常工作正常,但我无法重现它自己,我在调用后获得有关中止线程的本机崩溃日志

LOOPING_THREAD = std::thread(looping, 1);

例如

#00 pc 00044340  /system/lib/libc.so (tgkill+12)
#01 pc 00041f41  /system/lib/libc.so (pthread_kill+32)
#02 pc 0001ba6f  /system/lib/libc.so (raise+10)
#03 pc 00018c11  /system/lib/libc.so (__libc_android_abort+34)
#04 pc 000167d0  /system/lib/libc.so (abort+4)
#05 pc 00010aa3  /data/app/com.app-1/lib/arm/libapp.so    (_ZN9__gnu_cxx27__verbose_terminate_handlerEv+230)
#06 pc 0000cfb9  /data/app/com.app-1/lib/arm/libapp.so (_ZN10__cxxabiv111__terminateEPFvvE+4)
#07 pc 0000d0c1  /data/app/com.app-1/lib/arm/libapp.so (_ZSt9terminatev+8)
#08 pc 00008ddb  /data/app/com.app-1/lib/arm/libapp.so (_ZNSt6threadaSEOS_+38)

如何防止此次崩溃?我尝试添加互斥锁和解锁功能并停止如下,但它导致循环在完成之前暂停一段时间,这在这种情况下是不可接受的。

 void looping(int test) {
    while (do_job) {
      mutex.lock()
     LOGD("Doing job");
     mutex.unlock()
  }

 JNIEXPORT jint JNICALL
  Java_com_example_stop(JNIEnv *env, jobject thiz) {
   mutex.lock()
   do_job= false;
   mutex.unlock()
   return 0;
 }

更新

我已经删除了锁,而是在创建它并让它运行之后,我在JNI start(..)中使用detach()分离该线程。然后,在设置do_job = true

后,在JNI停止(...)处等待200 ms

那会有用吗?

1 个答案:

答案 0 :(得分:1)

_ZNSt6threadaSEOS_std::thread::operator=(std::thread&&)。您可以使用c++filt实用程序来解码符号名称。

来自std :: thread :: operator =

的文档
  

如果*仍然有一个关联的运行线程(即joinable()==   true),调用std :: terminate()。否则,将其他状态分配给   * this并将其他设置为默认构造状态。

因此,您的全局变量LOOPING_THREAD包含尚未完成的活动线程。