#plugin #thread-local-storage #shared-memory #local-storage #static-storage

plugin_tls

跨动态库边界的线程局部和静态存储

7个版本

0.4.1 2022年8月24日
0.4.0 2022年7月1日
0.3.0 2021年7月9日
0.2.3 2020年12月12日

#14 in #thread-local-storage

MIT授权

14KB
197

plugin_tls

跨动态库边界的线程局部和静态持续时间存储支持。

通常,一个 std::thread::LocalKey 指的是单个二进制中的一个特定内存位置。这个库通过在宿主和插件之间存储线程局部值在一个共享映射中,增加了跨二进制文件的线程局部存储支持。

该库还增加了跨二进制边界的静态持续时间(但必须是惰性初始化的)存储支持,因为这种实现与线程局部存储非常相似。

使用

使用 host 功能来启用宿主功能(在内存中加载的恰好一个二进制文件中),并使用 plugin 功能来启用插件功能(零个或多个二进制文件中)。

在每个插件二进制文件中,在访问任何线程局部或静态存储之前(通常是作为二进制启动例程的一部分),使用宿主上下文调用 Context::initialize。宿主二进制将默认为正确状态,但是这也可以通过 initialize 覆盖。

除此之外,thread_local! 宏在宿主和插件中都像 std::thread_local! 一样工作,而 lazy_static! 则与 lazy_static 包完全相同。请注意,线程局部和静态值是通过给定的名称、类型和模块路径索引的,因此这些 不能 冲突。另外,请注意,存储的值 必须 是abi稳定的。由于库的灵活性,不强制执行LocalKey(例如,使用abi_stable::StableAbi特质)的abi稳定性,但强烈建议使用abi_stable包。

请注意,可以同时启用hostplugin,特别是对于可能包含宿主和插件的工作区。

安全性

如果卸载插件,必须确保从线程局部或静态存储中移除插件设置的任何内存(包括任何初始值!)!未来可能会添加跟踪特定插件创建的初始值的附加功能,但到目前为止,一种解决方案是宿主调用Context::reset以清除所有线程局部和静态值。

依赖关系

~5–11MB
~112K SLoC