Я хотел получить предложения относительно правильного способа реализации функций обратного вызова в Cassandra.
Я сделал несколько API, используя драйвер Cassandra C ++. Ниже приведено, как я использовал функцию обратного вызова для выполнения моего запроса (l_stmt — подготовленный оператор, а rtInsertCallback — функция обратного вызова):
CassFuture * l_query_future = cass_session_execute(RtConnectionObj::ms_session, l_stmt);
CassError l_returnCode = cass_future_set_callback(l_query_future,rtInsertCallback,NULL);
if(l_returnCode != CASS_OK)
{
printf("\n [ %s::%d ] Error \n",__FILE__,__LINE__);
}cass_future_free(l_query_future);
Предполагая, что приведенный выше код выполняется в потоке 1, в соответствии с моим текущим пониманием, функция обратного вызова будет выполняться, когда будет установлено будущее, и то же самое в отдельном потоке (поток 2). Функция обратного вызова выглядит следующим образом:
void rtInsertCallback(CassFuture* l_csp_future, void *data)
{
CassError l_returnCode = cass_future_error_code(l_csp_future);
if (l_returnCode != CASS_OK)
{
printf("\n[%s::%d] %s ",__FILE__,__LINE__,cass_error_desc(l_returnCode));
}
else
{
printf("\n [%s::%d] Data Inserted successfully ...",__FILE__,__LINE__);
}
}
Я хочу знать, возможно ли, что до того, как будет установлено будущее или до того, как CassError l_returnCode = cass_future_error_code(l_csp_future);
оператор выполняется в потоке 2, будущее освобождается потоком 1, из-за чего вышеприведенный оператор в потоке 2 будет работать в освобожденном будущем? Если да, то каким должен быть правильный способ обработки такого сценария? Если этот вопрос не имеет никакого смысла (из-за моего неправильного понимания какой-либо концепции), пожалуйста, объясните. Спасибо!
Задача ещё не решена.
Других решений пока нет …