正如标题所示,我对共享库如何与Rust中的线程局部变量一起工作感到困惑。下面我有一个最小的例子:
[package]
name = "minimal_thread_local_example"
version = "0.1.0"
edition = "2018"
[dependencies]
has_thread_local = {path ="./has_thread_local"}
libloading = "0.5"
[workspace]
members = ["shared_library","has_thread_local"]
extern crate libloading;
use libloading::{Library, Symbol};
use has_thread_local::{set_thread_local, get_thread_local};
fn main() {
let lib = Library::new("libshared_library.so").unwrap();
set_thread_local(10);
unsafe {
let func: Symbol<unsafe extern fn() -> u32> = lib.get(b"print_local").unwrap();
func();
};
println!("From static executable:{}", get_thread_local());
}
在名为has_thread_local
的板条箱中:
cargo.toml:
[package]
name = "has_thread_local"
version = "0.1.0"
edition = "2018"
[lib]
[dependencies]
src/lib.rs:
use std::cell::RefCell;
use std::ops::Deref;
thread_local! {
pub static A_THREAD_LOCAL : RefCell<u64> = RefCell::new(0);
}
pub fn set_thread_local(val: u64) {
A_THREAD_LOCAL.with(|refcell| { refcell.replace(val); })
}
pub fn get_thread_local() -> u64 {
A_THREAD_LOCAL.with(|refcell| *refcell.borrow().deref())
}
[package]
name = "shared-library"
version = "0.1.0"
edition = "2018"
[lib]
crate-type = ["cdylib"]
[dependencies]
has_thread_local = {path = "../has_thread_local"}
use has_thread_local::get_thread_local;
#[no_mangle]
unsafe extern "system" fn print_local() {
println!("From shared library:{}",get_thread_local());
}
From shared library:0
From static executable:10
之所以观察到这种行为,是因为共享库包含它自己的所依赖的板条箱代码副本,从而导致两个不同的线程本地声明。
解决这个问题的方法是传递对有问题的线程本地的引用,而不是直接访问线程本地。有关如何获取对线程局部变量的引用的更多信息,请参见此处:如何在Rust结构中创建线程局部变量?
问题内容: 我必须遵循以下方案: python字典的python列表列表中的 每个元素都是一个python字典,看起来像这样: 现在,我希望所有字典作为主模板中的列表。但是,每个词典的内容应由子模板呈现。应使用哪种模板来呈现内容,应由字典的type变量定义。 关于使用Jinja2如何完成此操作的任何提示(如果有帮助,我正在通过Flask使用它。) 谢谢! 问题答案: 如果有人需要它: 然后可以在模
本文向大家介绍Rust 静态的,包括了Rust 静态的的使用技巧和注意事项,需要的朋友参考一下 示例 该static关键字声明一个全局静态绑定,这可能是可变的。 这个输出
随着时间的流逝,异步 Rust 生态系统经历了许多演变,因此可能很难知道要使用哪些工具,要投资哪些库或要阅读哪些文档。然而,标准库中的Future trait ,和async/await语言功能最近已稳定。因此,整个生态系统正处于向新稳定的 API 迁移的阶段,此后,用户流失率将大大降低。 然而,目前,生态系统仍在快速发展,异步 Rust 体验还不够完善。大多数库仍使用 0.1 版本的future
本文向大家介绍Rust 在地图和and_then中使用Option,包括了Rust 在地图和and_then中使用Option的使用技巧和注意事项,需要的朋友参考一下 示例 map当处理数组和向量时,该操作是一个有用的工具,但是它也可以用于以Option函数方式处理值。
问题内容: 为什么以下SQL不能给我任何东西 虽然 吸引我的行 问题答案: 您可以根据需要执行一些动态SQL,但我认为这并不是真正的竞争。