在Cassandra中使用回调函数

时间:2018-04-03 08:52:01

标签: c++ multithreading cassandra cassandra-3.0

我想获得有关在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中的上述语句将会在一个自由的未来经营?如果是,那么处理这种情况的正确方法应该是什么?如果这个问题没有任何意义(由于我对任何概念的误解),请解释。谢谢!

1 个答案:

答案 0 :(得分:3)

您可以在回调语句后的“线程1”中释放将来。回调将拥有自己的未来副本,可以继续使用。

Cassandra回调函数在处理后还将负责资源清理。因此,我们不必明确释放未来。

代码示例可在此处找到

https://github.com/datastax/cpp-driver/blob/master/examples/callbacks/callbacks.c