我有一个看起来像这样的线程函数:
DWORD WINAPI Thread_ProcessFile( LPVOID lpParam ) {
char *filename = (char*)lpParam;
printf( "%s\n", filename );
}
我还有一个调用CreateThread的类,并将上述函数用于例程地址:
void CMyClass::ProcessFile( void ) {
HANDLE tHwnd = 0;
char szBuffer[128];
strcpy( szBuffer, "test_string" );
tHwnd = CreateThread( NULL, 0, Thread_ProcessFile, (LPVOID)szBuffer, 0, NULL );
if ( tHwnd == NULL )
return;
}
问题是例程正在接收/打印垃圾字符串而不是真实的字符串(例如随机字符集,如果有的话)。但是,如果我这样做:
tHwnd = CreateThread( NULL, 0, Thread_ProcessFile, (LPVOID)"test_string", 0, NULL );
接收并正确打印字符串。如何正确构建字符串并将其传递给我的线程函数?
答案 0 :(得分:7)
您正在堆栈上创建szBuffer。因此,当您的线程启动时,ProcessFile()函数将返回并且堆栈变量将被释放。因此,您获得了垃圾价值。在第二种情况下,您传递的是一个const-string,该帖子可能位于进程内存的只读部分,并且在函数返回时未被释放(我不认为这是保证的行为,我不会依靠它)。所以你在这个功能中获得了适当的价值。您可以使用new []在堆上分配字符串,并将指针传递给线程。在线程中完成处理后,不要忘记删除[]。
答案 1 :(得分:2)
在你的第一种情况下,szString
在堆栈上被声明,因此它在函数结束时被破坏,并且可能在新线程有机会接管之前被破坏。
相反,使用寿命较长的变量或堆上分配的东西(例如,使用new [])。