Rust-эквивалентный код для этого мьютекса C ++ - PullRequest
0 голосов
/ 03 мая 2020

Примеры мьютекса и потоков в inte rnet не годятся, так как я не могу найти, как заблокировать блок кода с помощью мьютекса для блокировки метода.

// mutex example
#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex

std::mutex mtx;           // mutex for critical section

void print_block (int n, char c) {
  // critical section (exclusive access to std::cout signaled by locking mtx):
  mtx.lock();
  for (int i=0; i<n; ++i) { std::cout << c; }
  std::cout << '\n';
  mtx.unlock();
}

int main ()
{
  std::thread th1 (print_block,50,'*');
  std::thread th2 (print_block,50,'$');

  th1.join();
  th2.join();

  return 0;
}

Что такое похожий код Rust для этого фрагмента C ++? Блокировка циклов и печать, как в примере с Rust, мьютекс должен быть такого типа, как

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let data = Arc::new(Mutex::new(vec![1u32, 2, 3]));

    for i in 0..3 {
        let data = data.clone();

        thread::spawn(move || {
            let mut data = data.lock().unwrap();
            data[i] += 1;
        });
    }
    thread::sleep_ms(50);
}

1 Ответ

0 голосов
/ 03 мая 2020

Я написал этот похожий код. Это нормально или лучше написано?

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let mtx = Arc::new(Mutex::new(""));

    let mtx1 = mtx.clone();

    let mtx2 = mtx.clone();

    let n = 50;

    let th1 = thread::spawn(move || {
        mtx1.lock().unwrap();

        printData(n, "*".to_string());
    });

    let th2 = thread::spawn(move || {
        mtx2.lock().unwrap();

        printData(n, "$".to_string());
    });

    th1.join();
    th2.join();
}

fn printData(n: u32, c: String) {
    let mut str_val: String = "".to_string();

    for i in 0..n {
        str_val.push_str(&c);
    }

    println!("{}", str_val);
}
...