设计一个Rust线程安全栈结构 Stack<T>

在Rust中,设计一个线程安全的栈结构Stack<T>,类似于Channel<T>,但使用栈的FILO(First-In-Last-Out)原则来在线程间传送数据,可以通过使用标准库中的同步原语如MutexCondvar来实现。下面是一个简单的实现示例:

use std::collections::VecDeque;
use std::sync::{Mutex, Condvar};
use std::thread;
use std::time::Duration;

pub struct Stack<T> {
    data: Mutex<VecDeque<T>>,
    not_empty: Condvar,
}

impl<T> Stack<T> {
    pub fn new() -> Stack<T> {
        Stack {
            data: Mutex::new(VecDeque::new()),
            not_empty: Condvar::new(),
        }
    }

    pub fn push(&self, item: T) {
        let mut data = self.data.lock().unwrap();
        data.push_front(item);
        self.not_empty.notify_one();
    }

    pub fn pop(&self) -> Option<T> {
        let mut data = self.data.lock().unwrap();
        while data.is_empty() {
            data = self.not_empty.wait(data).unwrap().0;
        }
        data.pop_back()
    }
}

// 示例用法
fn main() {
    let stack = Stack::new();
    let producer = thread::spawn(move || {
        for i in 1..=5 {
            stack.push(i);
            println!("Produced {}", i);
            thread::sleep(Duration::from_millis(500));
        }
    });

    let consumer = thread::spawn(move || {
        while let Some(item) = stack.pop() {
            println!("Consumed {}", item);
        }
    });

    producer.join().unwrap();
    consumer.join().unwrap();
}

在这个示例中,Stack<T>结构包含了一个受互斥锁保护的VecDeque<T>,它用作底层的数据存储。VecDeque是一个双端队列,但在这里我们只使用其作为栈的功能,通过push_frontpop_back方法来模拟栈的行为。not_empty是一个条件变量,用于在栈为空时阻塞消费者线程,直到有数据可用。

push方法中,我们将数据项推入栈中,并通过notify_one方法唤醒一个等待的消费者线程(如果有的话)。在pop方法中,我们检查栈是否为空,并在为空时使用wait方法阻塞当前线程,直到有数据被推入栈中。当栈不为空时,我们从栈中弹出一个数据项并返回它。

在示例的main函数中,我们创建了一个Stack<i32>实例,并启动了一个生产者线程和一个消费者线程。生产者线程将数字1到5推入栈中,每次推送后休眠500毫秒。消费者线程则不断地从栈中弹出数据项,并打印它们,直到栈为空为止。

相关推荐

  1. 设计一个Rust线安全结构 StackT

    2024-04-02 09:10:02       44 阅读
  2. 数据结构---(Stack)

    2024-04-02 09:10:02       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 09:10:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 09:10:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 09:10:02       82 阅读
  4. Python语言-面向对象

    2024-04-02 09:10:02       91 阅读

热门阅读

  1. 自建SSL证书(兼容ios)

    2024-04-02 09:10:02       39 阅读
  2. 【计算机网络】概述

    2024-04-02 09:10:02       39 阅读
  3. c#学习路线

    2024-04-02 09:10:02       40 阅读
  4. web3.0入门及学习路径

    2024-04-02 09:10:02       38 阅读
  5. uniapp项目--青年帮新闻项目

    2024-04-02 09:10:02       34 阅读
  6. LeetCode 2810.故障键盘:双端队列模拟

    2024-04-02 09:10:02       40 阅读
  7. 复叠式制冷系统介绍

    2024-04-02 09:10:02       40 阅读
  8. 算法——矩阵:对于边界元素的处理

    2024-04-02 09:10:02       44 阅读
  9. 动态规划 Leetcode 1143 最长公共子序列

    2024-04-02 09:10:02       39 阅读
  10. 拓扑排序(习题笔记 思路整理)之一

    2024-04-02 09:10:02       25 阅读
  11. 无极低码:同时删除两张表中的记录

    2024-04-02 09:10:02       38 阅读
  12. 阿里云效codeup如何执行github flow工作流

    2024-04-02 09:10:02       38 阅读
  13. 机器学习之局部异常因子算法(Local Outlier Factor)

    2024-04-02 09:10:02       35 阅读