当前位置: 首页 > 知识库问答 >
问题:

Thread_Local!在Rust中使用动态库?

段干祺
2023-03-14

正如标题所示,我对共享库如何与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

共有1个答案

巢靖
2023-03-14

之所以观察到这种行为,是因为共享库包含它自己的所依赖的板条箱代码副本,从而导致两个不同的线程本地声明。

解决这个问题的方法是传递对有问题的线程本地的引用,而不是直接访问线程本地。有关如何获取对线程局部变量的引用的更多信息,请参见此处:如何在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,但我认为这并不是真正的竞争。