Tob*_*aar 2 c++ multithreading
我有一个复制结构内容的问题..以下情况......我的类Session中有一个struct arg_struct:
struct Session::arg_struct
{
const char* targetFilePath;
const char* url;
unsigned int thread_id;
Session::ThreadFinishedCallbackFunction callback;
};
Run Code Online (Sandbox Code Playgroud)
在我的一个方法中,我启动一个线程并将结构赋予将要执行的函数:
{
...
arg_struct args;
args.targetFilePath = targetFilePath;
args.url = req_url;
args.thread_id = ++mThread_id;
args.callback = callback;
curl_global_init(CURL_GLOBAL_ALL);
error = pthread_create(&thread,NULL,download,&args);
}
Run Code Online (Sandbox Code Playgroud)
现在将执行下载功能:
void* download(void* arguments)
{
Session::arg_struct ar = *(Session::arg_struct*) arguments;
Session::arg_struct args;
args.targetFilePath = new char[strlen(ar.targetFilePath)];
args.url = new char[strlen(ar.url)];
strcpy(const_cast<char*>(args.targetFilePath),ar.targetFilePath);
strcpy(const_cast<char*>(args.url),ar.url);
args.callback = ar.callback;
args.thread_id = ar.thread_id;
cout << "copied" << endl;
CURL *curl;
FILE* datafile;
datafile = fopen(args.targetFilePath, "w");
if(datafile != NULL)
{
curl = curl_easy_init();
curl_easy_setopt(curl,CURLOPT_URL,args.url);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,datafile);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
fclose(datafile);
} else {
cout << "error: failed to open file!" << endl;
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
在下载函数的开头我复制struct(I quess;))但是我得到了无法打开文件的错误.问题是,当我尝试用fopen()打开文件时,struct是空的.似乎我没有正确复制结构,或者指向struct(void*arguments)的指针已经无法使用.你有什么建议吗?
看起来,当您创建结构时,您正在堆栈上执行它.当该函数返回时,它的堆栈就会消失,结构也会消失.在我看来,在下载有机会复制之前,结构就会消失.
相反,您应该在堆上分配结构(使用new),并在下载时释放它.此外,由于下载将取得它的所有权,你不必真正复制它.