gpt4 book ai didi

android - NDK c++ std::thread 在加入时中止崩溃

转载 作者:行者123 更新时间:2023-11-30 05:17:35 25 4
gpt4 key购买 nike

首先,我之前没有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;
}

}

上面通常工作正常但是虽然我不能自己重现它,但我在调用之后得到了关于中止线程的 native 崩溃日志

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)

我怎样才能避免这种崩溃?我尝试添加互斥锁和解锁以运行并停止,但它会导致循环在完成之前挂起一段时间,这在这种情况下是 Not Acceptable 。

 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 stop(...) 等待 200 ms

那行得通吗?

最佳答案

_ZNSt6threadaSEOS_ 是一个 std::thread::operator=(std::thread&&)。您可以使用 c++filt 实用程序来分解符号名称。

来自 std::thread::operator= 的文档

If *this still has an associated running thread (i.e. joinable() == true), call std::terminate(). Otherwise, assigns the state of other to *this and sets other to a default constructed state.

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

关于android - NDK c++ std::thread 在加入时中止崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42066700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com