У меня есть 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
*/
}
Означает ли это, что вмногопоточные программы, когда всякий раз указатель должен передаваться между разными потоками, указатель всегда должен указывать на выделенную кучу память?
Обратите внимание, что func2 () на самом деле является функцией обратного вызова, котораявыполняется при наступлении события.Я спрятал эти детали в вопросе.Func1 () не останавливает и не ждет выполнения func2 ().
Edit : я чувствую, что мне нужно предоставить более подробную информацию о моей реализации.В моей программе я использую клиентскую библиотеку Datastax C ++ для Cassandra.Пожалуйста, найдите ссылку в конце, содержащую некоторые детали функций, используемых в программе:
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;
}
Ссылки на API драйвера Datastax:
- cass_future_set_callback
- CassFuture
- CassSession
- cass_session_execute