我想获得有关在Cassandra中实现回调函数的正确方法的建议。
我使用Cassandra的C ++驱动程序制作了一些API。下面是我如何使用回调函数来执行我的查询(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__);
}
}
我想知道,在未来设置之前或者在线程2中执行CassError l_returnCode = cass_future_error_code(l_csp_future);
语句之前,未来是否可以被线程1释放,因为线程2中的上述语句将会在一个自由的未来经营?如果是,那么处理这种情况的正确方法应该是什么?如果这个问题没有任何意义(由于我对任何概念的误解),请解释。谢谢!
答案 0 :(得分:3)
您可以在回调语句后的“线程1”中释放将来。回调将拥有自己的未来副本,可以继续使用。
Cassandra回调函数在处理后还将负责资源清理。因此,我们不必明确释放未来。
代码示例可在此处找到
https://github.com/datastax/cpp-driver/blob/master/examples/callbacks/callbacks.c