pthread_create 内存泄漏 valgrind

pthread_create()在使用的过程中遇到的一个问题: 

今天在使用线程的时候出现了一个问题,利用valgrind监测程序的运行时出现了memory leak。感觉到很奇怪,这样的情况应该不会发生的啊,毕竟是系统的函数。去网上搜了下,发现国内国外都有这个问题 呵呵。大概了解了下原因:创建的线程需要进行join或者detach状态,这样才能保证创建线程过程中分配的内存得以释放,才能避免memory leak的情况。因此,记得需要将线程进行join或者detach。

线程的分离状态决定一个线程以什么样的方式来终止自己。线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。

有以下的方法来解决这个问题:
1、创建线程,使用默认的非分离状态,然后进行join

pthread_create(&threadid, NULL, func, NULL);

pthread_join(threadid, &state);
2、创建线程时利用pthread_attr_setdeatchstate()指定线程的属性为PTHREAD_CREATE_DETACHED

pthread_attr_t attr;

pthread_attr_init(&attr);

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

pthread_create(&threadid, &attr, func, NULL);

pthread_attr_destroy(&attr);
3、在默认创建完进程后,使用pthread_detach函数,使得线程处于detach状态;或者在func中调用pthread_detach函数,线程自行退出

pthread_create(&threadid, NULL, func, NULL);

pthread_detach(threadid);

或者:

pthread_create(&threadid, NULL, func, NULL);

void* func(void*)

{





pthread_detach(pthread_self());

return ((void*)0);

}

参考文章:

http://jiejie.blog.techweb.com.cn/archives/231.html

以及其他。。。。


转载于http://blog.youkuaiyun.com/jiqiren007/article/details/5959810,谢谢

extern "C" JNIEXPORT void JNICALL Java_com_sisheng_fitscreen_pose_Yolov8Pose_openRtspUrl( JNIEnv *env, jobject, jobjectArray rtspUrlArr, jobjectArray cameraIdArr ) { isOpenRtsp = true; jsize length = env->GetArrayLength(rtspUrlArr); int ii = 0; for (jsize i = 0; i < length; ++i) { jstring jRtspUrlElement = (jstring) (env->GetObjectArrayElement(rtspUrlArr, i)); jstring jCameraIdElement = (jstring) (env->GetObjectArrayElement(cameraIdArr, i)); // 创建全局引用 jobject rtspUrlGlobalStringRef = (jstring) env->NewGlobalRef(jRtspUrlElement); jobject cameraIdGlobalStringRef = (jstring) env->NewGlobalRef(jCameraIdElement); const char *cRtspUrlElement = env->GetStringUTFChars(jRtspUrlElement, nullptr); const char *cCameraIdElement = env->GetStringUTFChars(jCameraIdElement, nullptr); // 准备要传递给线程的数据 ThreadData *data = new ThreadData(); data->url = cRtspUrlElement; data->cameraId = cCameraIdElement; data->indexStr = std::to_string(ii); __LOG_PRINT(ANDROID_LOG_DEBUG, "rtsp", "xxxxxxxxxx ii: %i a:%s", ii, data->indexStr.c_str()); ii++; pthread_t thread_1; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (pthread_create(&thread_1, NULL, open_media, data) != 0) { // 错误处理:释放全局引用并删除data env->DeleteGlobalRef(rtspUrlGlobalStringRef); env->DeleteGlobalRef(cameraIdGlobalStringRef); env->ReleaseStringUTFChars(jRtspUrlElement, cRtspUrlElement); env->ReleaseStringUTFChars(jCameraIdElement, cCameraIdElement); env->DeleteLocalRef(jRtspUrlElement); env->DeleteLocalRef(jCameraIdElement); __LOG_PRINT(ANDROID_LOG_ERROR, "rtsp", "delete data"); delete data; } // 立即释放本地引用 env->ReleaseStringUTFChars(jRtspUrlElement, env->GetStringUTFChars(jRtspUrlElement, nullptr)); env->ReleaseStringUTFChars(jCameraIdElement, env->GetStringUTFChars(jCameraIdElement, nullptr)); env->DeleteLocalRef(jRtspUrlElement); env->DeleteLocalRef(jCameraIdElement); pthread_attr_destroy(&attr); } }这个代码在配置多个摄像头时会出现段错误,分析可能的原因?会不会和调用端有关?
最新发布
03-30
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值