Struct threadpool::ThreadPool [] [src]

pub struct ThreadPool { /* fields omitted */ }

Abstraction of a thread pool for basic parallelism.

Methods

impl ThreadPool
[src]

Creates a new thread pool capable of executing num_threads number of jobs concurrently.

Panics

This function will panic if num_threads is 0.

Examples

Create a new thread pool capable of executing four jobs concurrently:

use threadpool::ThreadPool;

let pool = ThreadPool::new(4);

Creates a new thread pool capable of executing num_threads number of jobs concurrently. Each thread will have the name name.

Panics

This function will panic if num_threads is 0.

Examples

use std::thread;
use threadpool::ThreadPool;

let pool = ThreadPool::with_name("worker".into(), 2);
for _ in 0..2 {
    pool.execute(|| {
        assert_eq!(
            thread::current().name(),
            Some("worker")
        );
    });
}
pool.join();

Deprecated

Executes the function job on a thread in the pool.

Examples

Execute four jobs on a thread pool that can run two jobs concurrently:

use threadpool::ThreadPool;

let pool = ThreadPool::new(2);
pool.execute(|| println!("hello"));
pool.execute(|| println!("world"));
pool.execute(|| println!("foo"));
pool.execute(|| println!("bar"));
pool.join();

Returns the number of jobs waiting to executed in the pool.

Examples

use threadpool::ThreadPool;
use std::time::Duration;
use std::thread::sleep;

let pool = ThreadPool::new(2);
for _ in 0..10 {
    pool.execute(|| {
        sleep(Duration::from_secs(100));
    });
}

sleep(Duration::from_secs(1)); // wait for threads to start
assert_eq!(8, pool.queued_count());

Returns the number of currently active threads.

Examples

use threadpool::ThreadPool;
use std::time::Duration;
use std::thread::sleep;

let pool = ThreadPool::new(4);
for _ in 0..10 {
    pool.execute(move || {
        sleep(Duration::from_secs(100));
    });
}

sleep(Duration::from_secs(1)); // wait for threads to start
assert_eq!(4, pool.active_count());

Returns the maximum number of threads the pool will execute concurrently.

Examples

use threadpool::ThreadPool;

let mut pool = ThreadPool::new(4);
assert_eq!(4, pool.max_count());

pool.set_num_threads(8);
assert_eq!(8, pool.max_count());

Returns the number of panicked threads over the lifetime of the pool.

Examples

use threadpool::ThreadPool;

let pool = ThreadPool::new(4);
for n in 0..10 {
    pool.execute(move || {
        // simulate a panic
        if n % 2 == 0 {
            panic!()
        }
    });
}
pool.join();

assert_eq!(5, pool.panic_count());

Deprecated since 1.3.0

: use ThreadPool::set_num_threads

Deprecated: Use ThreadPool::set_num_threads

Sets the number of worker-threads to use as num_threads. Can be used to change the threadpool size during runtime. Will not abort already running or waiting threads.

Panics

This function will panic if num_threads is 0.

Examples

use threadpool::ThreadPool;
use std::time::Duration;
use std::thread::sleep;

let mut pool = ThreadPool::new(4);
for _ in 0..10 {
    pool.execute(move || {
        sleep(Duration::from_secs(100));
    });
}

sleep(Duration::from_secs(1)); // wait for threads to start
assert_eq!(4, pool.active_count());
assert_eq!(6, pool.queued_count());

// Increase thread capacity of the pool
pool.set_num_threads(8);

sleep(Duration::from_secs(1)); // wait for new threads to start
assert_eq!(8, pool.active_count());
assert_eq!(2, pool.queued_count());

// Decrease thread capacity of the pool
// No active threads are killed
pool.set_num_threads(4);

assert_eq!(8, pool.active_count());
assert_eq!(2, pool.queued_count());

Block the current thread until all jobs in the pool have been executed.

Calling join on an empty pool will cause an immediate return. join may be called from multiple threads concurrently.

Calling join from a thread within the pool will cause a deadlock. This behavior is considered safe.

Examples

use threadpool::ThreadPool;
use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};

let pool = ThreadPool::new(8);
let test_count = Arc::new(AtomicUsize::new(0));

for _ in 0..42 {
    let test_count = test_count.clone();
    pool.execute(move || {
        test_count.fetch_add(1, Ordering::Relaxed);
    });
}

pool.join();
assert_eq!(42, test_count.load(Ordering::Relaxed));

Trait Implementations

impl Clone for ThreadPool
[src]

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

impl Debug for ThreadPool
[src]

Formats the value using the given formatter.