dpdk多线程访问hs的database

1. hs_scratch_t

Hyperscan在扫描数据的时候,需要少量的临时空间来存储动态的内部数据。

2. 只有1个核但有多个数据库

只有1个核,但有多个数据库时

  • 只需要一个临时区域,使用hs_alloc_scratch()来分配。
  • 为每个数据库调用hs_alloc_scratch()来确保分配的临时空间足够大。

3. 有一个主进程,多个备进程的情况

在有多个核同时工作的场景中,扫描全局的hs数据库。

  • 使用hs_clone_scratch()为每个线程创建一个临时控件。

下面的代码是一个例子:

hs_error_t err;
/* 为数据库db创建临时空间,如果有多个数据库则需要为scratch_prototype调用多次hs_alloc_scratch,
 *  例如有db1和db2:
 *   ...
 *   err = hs_alloc_scratch(db1, &scratch_prototyep);
 *   ...
 *   err = hs_alloc_scratch(db2, &scratch_prototyep);
 *   ...
 **/
hs_scratch_t *scratch_prototype = NULL;
err = hs_alloc_scratch(db, &scratch_prototype);
if (err != HS_SUCCESS) {
    printf("hs_alloc_scratch failed!");
    exit(1);
}

/* 每个线程都应该有一个自己的scratch临时空间 */
hs_scratch_t *scratch_thread1 = NULL;
hs_scratch_t *scratch_thread2 = NULL;

/* 为每个线程克隆一个临时空间 */
err = hs_clone_scratch(scratch_prototype, &scratch_thread1);
if (err != HS_SUCCESS) {
    printf("hs_clone_scratch failed!");
    exit(1);
}
err = hs_clone_scratch(scratch_prototype, &scratch_thread2);
if (err != HS_SUCCESS) {
    printf("hs_clone_scratch failed!");
    exit(1);
}

/* 将alloc申请的临时空间释放,因为别的线程已不再需要这个临时空间 */
hs_free_scratch(scratch_prototype);


在没有为每个线程申请临时空间而共用1个临时空间,线程不安全,会发生段错误。

该例子中的两个线程此时可以使用自己的临时空间来访问database了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值