w3resource

Demonstrating Buffered Channels in Rust

Rust Error Propagation: Exercise-8 with Solution

Write a Rust program to demonstrate the use of buffered channels. Create a channel with a buffer size of 3 and send 5 messages through the channel. Ensure that sending blocks when the buffer is full and resumes when space becomes available.

Sample Solution:

Rust Code:

use std::sync::mpsc; // Import the mpsc module for channels
use std::thread; // Import the thread module for multi-threading

const BUFFER_SIZE: usize = 3; // Define the buffer size for the channel
const NUM_MESSAGES: usize = 5; // Define the number of messages to send

fn main() {
    // Create a buffered channel with a capacity of 3
    let (sender, receiver) = mpsc::sync_channel(BUFFER_SIZE);

    // Spawn a thread to send messages
    let sender_thread = thread::spawn(move || {
        // Send 5 messages through the channel
        for i in 0..NUM_MESSAGES {
            sender.send(i).unwrap(); // Send a message
            println!("Sent: {}", i); // Print the sent message
        }
    });

    // Spawn a thread to receive messages
    let receiver_thread = thread::spawn(move || {
        // Receive 5 messages from the channel
        for _ in 0..NUM_MESSAGES {
            let message = receiver.recv().unwrap(); // Receive a message
            println!("Received: {}", message); // Print the received message
        }
    });

    // Wait for sender and receiver threads to finish
    sender_thread.join().unwrap(); // Wait for the sender thread to finish
    receiver_thread.join().unwrap(); // Wait for the receiver thread to finish
}

Output:

Sent: 0
Sent: 1
Sent: 2
Sent: 3
Received: 0
Received: 1
Received: 2
Received: 3
Sent: 4
Received: 4

Explanation:

In the exercise above,

  • Import modules: The program imports 'std::sync::mpsc' for channels and 'std::thread' for thread management.
  • Define constants: It sets constants for the buffer size ('BUFFER_SIZE') and the number of messages to send ('NUM_MESSAGES').
  • Main function:
    • Channel creation: It creates a buffered channel with a capacity of 3 using 'mpsc::sync_channel'.
    • Spawn sender thread: It spawns a thread to send messages through the channel. The sender thread sends 5 messages sequentially.
    • Spawn receiver thread: It spawns another thread to receive messages from the channel. The receiver thread receives 5 messages sequentially.
    • Wait for threads to finish: It waits for both sender and receiver threads to finish execution using join().
  • Sender thread: Sends 5 messages through the channel. When the buffer is full, sending blocks until space becomes available.
  • Receiver thread: Receives 5 messages from the channel. As messages are sent and buffer space becomes available, receiving resumes.

Rust Code Editor:

Previous: Implementing a Message Broadcast System in Rust.
Next: Implementing Request-Response Pattern with Channels in Rust.

What is the difficulty level of this exercise?

Test your Programming skills with w3resource's quiz.



Become a Patron!

Follow us on Facebook and Twitter for latest update.

It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.

https://www.w3resource.com/rust/channels/rust-message-passing-exercise-8.php