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