dpdk多线程访问hs的database | 您所在的位置:网站首页 › dpdk多进程 › 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了。 |
CopyRight 2018-2019 实验室设备网 版权所有 |