Documentation
Language Guide
Rust
Tutorials
Threading with Wasix

Threading with WASIX

This is a sample project that shows how to use features such as threading and sleep in WASIX.

Prerequisites

The project requires the following tools to be installed on your system:

Start a new project

$ cargo new --bin wasix-threading
     Created binary (application) `wasix-threading` package

Your wasix-threading directory structure should look like this:

Your Cargo.toml should look like this:

Cargo.toml
[package]
name = "wasix-threading"
version = "0.1.0"
edition = "2021"
 
[dependencies]

Writing the Application

Basic Application Setup

We will write a basic threading example from the Rust Book (opens in a new tab).

Let's write code for the above:

src/main.rs
use std::thread;
use std::time::Duration;
 
fn main() {
    let handle = thread::spawn(|| {
        for i in 1..10 {
            println!("hi number {} from the spawned thread!", i);
            thread::sleep(Duration::from_millis(1));
        }
    });
 
    for i in 1..5 {
        println!("hi number {} from the main thread!", i);
        thread::sleep(Duration::from_millis(1));
    }
 
    handle.join().unwrap();
}

Breakdown of main function:

  • thread::spawn creates a new thread and returns a JoinHandle for it.
  • thread::sleep is used to sleep the thread for a given duration.
  • handle.join() waits for the thread to finish.

Running the Application

Run the application with the cargo:

$ cargo run
   Compiling wasix-threading v0.1.0 (/wasix-threading)
    Finished dev [unoptimized + debuginfo] target(s) in 0.04s
     Running `target/debug/wasix-threading`
hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the spawned thread!
hi number 2 from the main thread!
hi number 3 from the main thread!
hi number 3 from the spawned thread!
hi number 4 from the main thread!
hi number 4 from the spawned thread!
hi number 5 from the spawned thread!
hi number 6 from the spawned thread!
hi number 7 from the spawned thread!
hi number 8 from the spawned thread!
hi number 9 from the spawned thread!
all done

Compiling with WASIX

Let's compile it with wasix now.

$ cargo wasix build
   Compiling wasix-threading v0.1.0 (/wasix-threading)
    Finished dev [unoptimized + debuginfo] target(s) in 0.73s
info: Post-processing WebAssembly files

It builds! Now, let's try to run it:

$ cargo wasix run
    Finished dev [unoptimized + debuginfo] target(s) in 0.09s
     Running `cargo-wasix target/wasm32-wasmer-wasi/debug/wasix-threading.wasm`
info: Post-processing WebAssembly files
     Running `target/wasm32-wasmer-wasi/debug/wasix-threading.wasm`
hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the main thread!
hi number 2 from the spawned thread!
hi number 3 from the main thread!
hi number 3 from the spawned thread!
hi number 4 from the main thread!
hi number 4 from the spawned thread!
hi number 5 from the spawned thread!
hi number 6 from the spawned thread!
hi number 7 from the spawned thread!
hi number 8 from the spawned thread!
hi number 9 from the spawned thread!

Yay, it works! 🎉

Conclusion

In this tutorial, we saw that thread spawn and sleep work flawlessly in wasix.

wasix-rust-examples/wasix-threading