Crate crossbeam_deque[][src]

A concurrent work-stealing deque.

This data structure is most commonly used in schedulers. The typical setup involves a number of threads where each thread has its own deque containing tasks. A thread may push tasks into its deque as well as pop tasks from it. Once it runs out of tasks, it may steal some from other threads to help complete tasks more quickly. Therefore, work-stealing deques supports three essential operations: push, pop, and steal.

Types of deques

There are two types of deques, differing only in which order tasks get pushed and popped. The two task ordering strategies are:

  • First-in first-out (FIFO)
  • Last-in first-out (LIFO)

A deque is a buffer with two ends, front and back. In a FIFO deque, tasks are pushed into the back, popped from the front, and stolen from the front. However, in a LIFO deque, tasks are popped from the back instead - that is the only difference.

Workers and stealers

There are two functions that construct a deque: fifo and lifo. These functions return a Worker and a Stealer. The thread which owns the deque is usually called worker, while all other threads are stealers.

Worker is able to push and pop tasks. It cannot be shared among multiple threads - only one thread owns it.

Stealer can only steal tasks. It can be shared among multiple threads by reference or by cloning. Cloning a Stealer simply creates another one associated with the same deque.


use crossbeam_deque as deque;
use std::thread;

// Create a LIFO deque.
let (w, s) = deque::lifo();

// Push several elements into the back.

// This is a LIFO deque, which means an element is popped from the back.
// If it was a FIFO deque, `w.pop()` would return `Some(1)`.
assert_eq!(w.pop(), Some(3));

// Create a stealer thread.
thread::spawn(move || {
    assert_eq!(s.steal(), Some(1));
    assert_eq!(s.steal(), Some(2));



The stealer side of a deque.


The worker side of a deque.



Creates a work-stealing deque with the first-in first-out strategy.


Creates a work-stealing deque with the last-in first-out strategy.