无法将字符串传递给CreateThread接收器

时间:2009-09-20 06:26:22

标签: c++ string multithreading

我有一个看起来像这样的线程函数:

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 );

接收并正确打印字符串。如何正确构建字符串并将其传递给我的线程函数?

2 个答案:

答案 0 :(得分:7)

您正在堆栈上创建szBuffer。因此,当您的线程启动时,ProcessFile()函数将返回并且堆栈变量将被释放。因此,您获得了垃圾价值。在第二种情况下,您传递的是一个const-string,该帖子可能位于进程内存的只读部分,并且在函数返回时未被释放(我不认为这是保证的行为,我不会依靠它)。所以你在这个功能中获得了适当的价值。您可以使用new []在堆上分配字符串,并将指针传递给线程。在线程中完成处理后,不要忘记删除[]。

答案 1 :(得分:2)

在你的第一种情况下,szString在堆栈上被声明,因此它在函数结束时被破坏,并且可能在新线程有机会接管之前被破坏。

相反,使用寿命较长的变量或堆上分配的东西(例如,使用new [])。