dpdk多线程访问hs的database 您所在的位置:网站首页 dpdk多进程 dpdk多线程访问hs的database

dpdk多线程访问hs的database

2023-08-16 04:07| 来源: 网络整理| 查看: 265

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了。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有