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
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
包。
请注意,可以同时启用host
和plugin
,特别是对于可能包含宿主和插件的工作区。
安全性
如果卸载插件,必须确保从线程局部或静态存储中移除插件设置的任何内存(包括任何初始值!)!未来可能会添加跟踪特定插件创建的初始值的附加功能,但到目前为止,一种解决方案是宿主调用Context::reset
以清除所有线程局部和静态值。
依赖关系
~5–11MB
~112K SLoC