Rust 实现每线程全局上下文堆栈
我想实现一个线程本地全局堆栈,这样每个堆栈元素都代表这个线程当前正在做的事情。以下是我所拥有的:Rust 实现每线程全局上下文堆栈,rust,Rust,我想实现一个线程本地全局堆栈,这样每个堆栈元素都代表这个线程当前正在做的事情。以下是我所拥有的: use std::mem; use std::cell::RefCell; struct Activity { description: String } struct StackElement { activity: Activity, prev: StackNode } type StackNode = Option<Box<StackElement&g
use std::mem;
use std::cell::RefCell;
struct Activity {
description: String
}
struct StackElement {
activity: Activity,
prev: StackNode
}
type StackNode = Option<Box<StackElement>>;
struct Stack {
top: StackNode
}
thread_local!(static CONTEXT: RefCell<Stack> = RefCell::new( Stack { top: None }));
static AMIT: u32 = 3;
struct StackDisposer<'a> {
stack: &'a mut Stack
}
impl<'a> Drop for StackDisposer<'a> {
fn drop(&mut self) {
let prev = if let Some(ref mut boxed_element) = self.stack.top { (*boxed_element).prev } else { None };
mem::replace(&mut self.stack.top, prev );
}
}
impl Stack {
fn get_instance() -> &'static Stack {
// The compilation error is coming from here
CONTEXT.with(|s| {
&*s.borrow_mut()
})
}
fn push_new_activity(&mut self, description: String) -> StackDisposer {
let element = Box::new(StackElement {
activity: Activity { description: description},
prev: mem::replace(&mut self.top, None),
});
self.top = Some(element);
StackDisposer { stack: self }
}
}
其思想是客户端代码可以编写如下内容:
fn foo() {
let disposer1 = Stack::get_instance().push_new_activity("outer_activity");
{
let disposer2 = Stack::get_instance().push_new_activity("inner_activity");
// ...
// "inner_activity" should be popped here
}
// ...
// "outer_activity" should be popped here
}
如何修复编译错误?上的文档(由thread\u local!
创建)在这里相当清楚:“使用和方法生成对所包含值的引用,该引用不能跨线程发送或转义给定的闭包。”您必须在这些地方直接使用上下文
,或者提供不同的API。还要注意的是,您的示例包含大量与问题不太相关的代码和其他错误。