Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 实现每线程全局上下文堆栈_Rust - Fatal编程技术网

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。还要注意的是,您的示例包含大量与问题不太相关的代码和其他错误。