我有2个函数,func1()
和func2()
。 func2
将字符数组作为输入。这两个函数在不同的线程上运行。我从func2
称为func1
。当我将堆栈分配的数组传递给func2
时,从func2()
内部打印数组时得到了垃圾值。但是,当我将堆分配的数组传递给func2
时,我在func2()
内获得了正确的字符串,即
func2(char * char_array)
{
/* Some code */
cout<<char_array;
}
/ * 这不起作用(垃圾值已打印在func2()中) * /
func1()
{
char array_of_char[SIZE];
memset(array_of_char,0,SIZE);
strncpy(array_of_char,"SOME_STRING",SIZE);
func2(array_of_char); //Asynchronous call to func2(). func1() proceeds immediately.
/*
some code
*/
}
/ * 起作用(正确的值在func2中打印) * /
func1()
{
char * array_of_char=new char[SIZE];
memset(array_of_char,0,SIZE);
strncpy(array_of_char,"SOME_STRING",SIZE);
func2(array_of_char); //Asynchronous call to func2(). func1() proceeds immediately.
/*
some code
*/
}
这是否意味着在多线程程序中,每当必须在不同线程之间传递某些指针时,该指针应始终指向堆分配的内存?
编辑:我觉得我需要提供一些实现的更多细节。在我的程序中,我使用Cassandra的Datastax C++客户端库。请在最后找到链接,其中包含程序中使用的功能的一些详细信息:
int main()
{
func1();
/* some code */
return 0;
}
/ * 这不起作用(垃圾打印在func2中) * /
void func1()
{
/* some code */
char array_of_char[SIZE];
memset(array_of_char,0,SIZE);
strncpy(array_of_char,"SOME_STRING",SIZE);
CassFuture* l_query_future = NULL;
/* some code where query is created */
l_query_future = cass_session_execute(rtGetSession(), l_stmt); //l_stmt is the query statement, rtgetSession() returns CassSession *
cass_future_set_callback ( l_query_future, func2, (void *)array_of_char); //details in the link given in the end
/* some code */
}
/ * 起作用(正确的值在func2中打印) * /
void func1()
{
/* some code */
char * array_of_char=new char[SIZE];
memset(array_of_char,0,SIZE);
strncpy(array_of_char,"SOME_STRING",SIZE);
CassFuture* l_query_future = NULL;
/* some code where query is created */
l_query_future = cass_session_execute(rtGetSession(), l_stmt); //l_stmt is the query statement, rtgetSession() returns CassSession *
cass_future_set_callback ( l_query_future, func2, (void *)array_of_char);
/*
some code
*/
}
void func2(CassFuture* l_query_future, void * data)
{
/* some code */
cout<<(char *)data;
}
Datastax驱动程序API的引用:
最佳答案
如何在不同的线程下运行func1()和func2()? func1()直接调用func2(),因此它们在同一线程下运行。即使func1()的第一个实现也应该起作用,因为该数组仍在该位置。
编辑:
但是,直接从func1()内部调用func2()并不是“异步调用func2()”(即使在其他时候它被用作线程函数)。 “异步调用”表示使用func2()作为线程函数创建一个新线程。如果是这样,则非常希望得到这种行为,因为func1()在func2()运行时可能已经退出,并且那时该数组将不存在。另一方面,堆块仍将被分配,因此它将起作用。 func2()应该然后释放该块。
编辑2:
嗯,是的,第二个版本确实是“对func2()的异步调用”,因此上面列出的对象的生命周期注意事项确实适用。
关于c++ - 将指针传递到另一个线程的正确方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50676057/