Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

crossbeam 的 11.2.1 双向队列 deque 的代码示例问题 #17

Open
fan-tastic-z opened this issue Sep 27, 2024 · 2 comments
Open

crossbeam 的 11.2.1 双向队列 deque 的代码示例问题 #17

fan-tastic-z opened this issue Sep 27, 2024 · 2 comments

Comments

@fan-tastic-z
Copy link
Contributor

现在pdf 中的代码 感觉不是特别好理解,更改为如下代码是不是会更好点:

use std::{
    sync::{Arc, Mutex},
    thread,
};

use crossbeam::deque::{Injector, Steal, Worker};

fn main() {
    let injector = Arc::new(Injector::new());

    let worker1 = Arc::new(Mutex::new(Worker::<i32>::new_fifo()));
    let worker2 = Arc::new(Mutex::new(Worker::<i32>::new_fifo()));

    for i in 0..10 {
        injector.push(i);
    }

    let worker1_clone = Arc::clone(&worker1);
    let injector_clone1 = Arc::clone(&injector);
    let handle1 = thread::spawn(move || loop {
        let worker1 = worker1_clone.lock().unwrap();
        if let Some(task) = worker1.pop() {
            println!("worker1 executing task: {}", task);
        } else {
            // 窃取一批任务,将它们推送到 worker1 中
            match injector_clone1.steal_batch_and_pop(&worker1) {
                Steal::Empty => break,
                Steal::Success(task) => println!("worker1 stole task: {} from injector", task),
                Steal::Retry => continue,
            }
        }
    });

    let worker2_clone = Arc::clone(&worker2);
    let injector_clone2 = Arc::clone(&injector);
    let handle2 = thread::spawn(move || loop {
        let worker2 = worker2_clone.lock().unwrap();
        if let Some(task) = worker2.pop() {
            println!("worker2 executing task: {}", task);
        } else {
            // 窃取一批任务,将它们推送到 worker1 中
            match injector_clone2.steal() {
                Steal::Empty => break,
                Steal::Success(task) => println!("worker2 stole task: {} from worker1", task),
                Steal::Retry => continue,
            }
        }
    });

    let injector_clone3 = Arc::clone(&injector);
    let worker1_clone2 = Arc::clone(&worker1);
    let handle3 = thread::spawn(move || loop {
        // 窃取一批任务,将它们推送到 worker1 中
        match injector_clone3.steal_batch_and_pop(&worker1_clone2.lock().unwrap()) {
            Steal::Empty => break,
            Steal::Success(task) => println!("worker1 stole task: {} from injector", task),
            Steal::Retry => continue,
        }
    });
    handle1.join().unwrap();
    handle2.join().unwrap();
    handle3.join().unwrap();
}

@smallnest
Copy link
Owner

请标注多少页的代码,否则不容易查找修改

@fan-tastic-z
Copy link
Contributor Author

fan-tastic-z commented Sep 29, 2024

补充pdf 页数:157-158 关于 并发工作窃取双向队列的示例代码

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants