我需要一个线程局部变量,理想情况下将其存储在一个结构中,该结构当前存储了程序的大多数全局状态。
我可以看到的第一种方法是使用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] 删除。
我来说两句