C++: pthread 传递参数注意值的生命周期

本文描述了在C语言中使用异步方式存储文件时遇到的问题,即线程间数据传递导致的宽度和高度值丢失。作者发现将Frame对象声明在类外可以避免内存回收问题,提供了解决方案。
摘要由CSDN通过智能技术生成

#因为C会写得比较少,所以记录
这里我是异步做一个文件存储

 if (mCurrentFrame != NULL ) {
       
        pthread_t thread_id;
        //
        Frame frame;
        frame.width = mFrameWidth;
        frame.height = mFrameHeight;
        
        uint8_t* frameData = reinterpret_cast<uint8_t*>(malloc(sizeof(uint8_t) * (frame.width * frame.height * 3 / 2)));
        memset(frameData, 0, sizeof(frameData));
        memcpy(mCurrentFrame, frameData, frame.width * frame.height * 3 / 2);
        frame.frameData = frameData;
        ALOGV("%s , frame width %d,frame height %d,frame size:%d", __FUNCTION__, frame.width, frame.height,sizeof(frame));
        int ret = pthread_create(&thread_id, NULL, saveFile, &frame);
        if (ret != 0)
        {
            ALOGE("%s: pthread_create failed", __FUNCTION__);
            return ;
        }
        //
        ALOGV("%s,thread start success", __FUNCTION__);
    }
    return ...

线程静态函数:

static void*  saveFile(void* arg)
{
    //
       
    Frame* frame = (Frame*)arg;
    int width = frame->width;
    int height = frame->height;
    ALOGV("%s ,frame width: %d  frame height :%d", __FUNCTION__, width,height);
 
    uint8_t* frameData = frame->frameData;
    //ALOGE("%s: save pic width: %d ,height : %d failed", __FUNCTION__, width, height);
    if (frameData != NULL) {
        FILE* file = fopen("/data/take_pic_test.yuv", "wb");
        fwrite(frameData, 1, static_cast<size_t>(width * height * 3 / 2), file);
    }
    else
    {
        ALOGV("%s  can't get frame data", __FUNCTION__);
    }
    if (frame->frameData != NULL)
    {
        delete[] frame;
    }
        
    return 0;
}

在线程中,width 和 height 基本的数据都是没有成功拿到,输出为乱七八糟,显然存放地址被干没了。
查阅资料
其注意事项中,表明传递的参数如果在线程还没有工作就被回收,那将会出现获取不到参数。
这里我在函数体里面声明的对象frame:Frame frame;
刚好吻合注意事项,如果我把 frame申明在类里面,可规避。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值