启动类函数作为线程丢失参考

时间:2018-10-09 11:37:05

标签: c++ beginthread

我正在研究Windows程序,该程序在线程中进行艰苦的工作 并且GUI停留在主循环中(在这种情况下,我使用ImGui OpenGL3)

但是随着实现更多功能,参数超出了范围 启动work_thread时 并且由beginthread启动的函数接收到显示为NULL的指针 (实际上,不更改代码,而是包含另一个库会引起这种情况)

发生了什么事以及如何防止这种情况发生

这是我的代码的原始再现

#include <process.h>


class JOBS
{
public:
  void jobA(char *path);

};

void JOBS::jobA(char*path) {   . .     }


class APP_DATA
{
public:
  JOBS jobs;

public:
  char *path;
};



void job_a_threadstarter(void* pParams )
{
APP_DATA *app=*(APP_DATA **)  pParams;   

  app->jobs.jobA(app->path);  
}


void job_starter(APP_DATA *app)
{     
  _beginthread(job_a_threadstarter,0,&app);        
}



int main(int, char**)
{
APP_DATA app; 
char workpath[99]="path_to_somewhere";

    .
    .

  app.path=workpath;
  job_starter(&app);



    .
    .
}

通常,代码运行没有问题, 但是其他例程中的某些更改和job_a_threadstarter崩溃,因为pParams引用了NULL

我在x64 Windows上将GNU G ++与mingw一起使用 使用c ++ 11开关进行编译并与-mwindows链接

1 个答案:

答案 0 :(得分:1)

您正在传递指向app结束时被销毁的局部变量(job_starter)的指针

_beginthread(job_a_threadstarter,0,&app); // you are getting pointer to local variable

替换为

_beginthread(job_a_threadstarter,0,app); // forward pointer to app