如何在Rust结构内部创建线程局部变量?

皮洛克

我需要一个线程局部变量,理想情况下将其存储在一个结构中,该结构当前存储了程序的大多数全局状态。

我可以看到的第一种方法是使用thread_local!宏,但是我想将此线程保持在状态结构内。

我可以看到的第二种方法是HashMap<Thread,MyThreadLocalData>在线程与线程局部变量的值之间具有或相似的值。然后,我将有一个用于thread::current获取适当值的吸气剂

我要提到的最后一个要求是,并非给定程序中的所有线程都是由Rust代码创建的,但是Rust代码可以在任何线程上运行,因此解决方案对此应该是可靠的。

有最佳的做法吗?也许有一种threadId允许我使用简单的Vec而不是HashMap(和/或避免散列开销)的方法?有图书馆吗?

另一个选择是修改可以在多线程上下文中使用的每个函数的参数,以同时采用状态结构和线程局部状态结构,但是,这对于不由Rust创建的线程不容易使用。

乐观桃子

通过在结构中使用线程局部变量,可以将其放置在impl块中:

use std::cell::RefCell;

struct Foo;
impl Foo {
    thread_local! {
        // Could add pub to make it public to whatever Foo already is public to.
        static FOO: RefCell<usize> = RefCell::new(0);
    }
}

可以使用Foo::FOO以下命令访问

Foo::FOO.with(|x| println!("{:?}", x));

Playground
注意,但是,访问它必须在Foo::它之前进行,因为它不是一个字段,而是一个related static

也可以通过存储对它的引用来完成:

use std::cell::RefCell;
use std::thread::LocalKey;

thread_local! {
    // Note lack of pub
    static FOO: RefCell<usize> = RefCell::new(0);
}
struct Bar {
    // Visibility here changes what can see `foo`.
    foo: &'static LocalKey<RefCell<usize>>,
    // Rest of your data.
}
impl Bar {
    fn constructor() -> Self {
        Self {
            foo: &FOO,
            // Rest of your data.
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章