LogoChemical Docs
Ctrl+K

Concurrency: ThreadPool & Tasks

Chemical provides a robust set of concurrency primitives in the std::concurrent namespace, ranging from low-level thread management to high-level task pools.

Thread Management

You can spawn native threads using std::concurrent::spawn.

import std

func worker(arg : *void) : *void {
    printf("Thread running!\n")
    return null
}

public func main() {
    var thread = std::concurrent::spawn(worker, null)
    thread.join()
}

ThreadPool

The ThreadPool is the recommended way to handle multiple tasks efficiently without the overhead of creating and destroying threads repeatedly.

Creating a Pool

// Create a pool with 4 worker threads

var pool = std::concurrent::create_pool(4u)

Submitting Tasks

You can submit tasks that return a value using submit, which returns a Future, or fire-and-forget tasks using submit_void.

// Submit a task with a return value

var future = pool.submit<int>(|x| () => {
    return 42
})

// Wait for result

var result = future.get()
printf("Result: %d\n", result)

// Submit a void task

pool.submit_void(() => {
    printf("Background task done\n")
})

Futures and Promises

Futures and Promises allow for safe communication between threads.

// Futures are automatically handled by the ThreadPool,

// but can be used manually for custom synchronization patterns.

Utilities

var cores = std::concurrent::hardware_threads()
printf("System has %d cores\n", cores)
TIP
Use ThreadPool for CPU-bound tasks to maximize performance while keeping your main thread responsive.