Rust 如何在锈线中使用克隆

Rust 如何在锈线中使用克隆,rust,thread-safety,condition-variable,Rust,Thread Safety,Condition Variable,在这个rust程序中,在run函数中,我试图将“pair_clone”作为两个线程的参数传递,但是我一直得到一个不匹配的类型错误?我以为我传递的是一对,但它说我传递的是一个整数 use std::sync::{Arc, Mutex, Condvar}; fn producer(pair: &(Mutex<bool>, Condvar), num_of_loops: u32) { let (mutex, cv) = pair; //prints "p

在这个rust程序中,在run函数中,我试图将“pair_clone”作为两个线程的参数传递,但是我一直得到一个不匹配的类型错误?我以为我传递的是一对,但它说我传递的是一个整数

use std::sync::{Arc, Mutex, Condvar};
fn producer(pair: &(Mutex<bool>, Condvar), num_of_loops: u32) {
     let (mutex, cv) = pair;
    //prints "producing"    
    }

}

fn consumer(pair: &(Mutex<bool>, Condvar), num_of_loops: u32) {
let (mutex, cv) = pair;
//prints "consuming"
    }
}

pub fn run() {
    println!("Main::Begin");
    let num_of_loops = 5;
    let num_of_threads = 4;
    let mut array_of_threads = vec!();

    let pair = Arc ::new((Mutex::new(true), Condvar::new()));
    for pair in 0..num_of_threads {
        let pair_clone = pair.clone();
        array_of_threads.push(std::thread::spawn( move || producer(&pair_clone, num_of_loops)));
        array_of_threads.push(std::thread::spawn( move || consumer(&pair_clone, num_of_loops)));
    }

    for i in array_of_threads {
        i.join().unwrap();
    }    


    println!("Main::End");
}
使用std::sync::{Arc,Mutex,Condvar};
fn生产者(对:&(互斥,Condvar),循环数:u32){
let(互斥,cv)=对;
//印刷品“生产”
}
}
fn使用者(对:&(互斥,Condvar),循环数:u32){
let(互斥,cv)=对;
//打印“消费”
}
}
pub fn run(){
println!(“Main::Begin”);
设_循环的数量=5;
设线程数=4;
让mut数组_of_threads=vec!();
让pair=Arc::new((Mutex::new(true),Condvar::new());
对于0..num_中的成对线程{
让pair_clone=pair.clone();
数组_of_threads.push(std::thread::spawn(move | | | producer(&pair_clone,num_of_loops));
数组_of_threads.push(std::thread::spawn(move | | | consumer(&pair_clone,num_of_loops));
}
对于线程数组中的i{
i、 join().unwrap();
}    
println!(“Main::End”);
}

您有两个主要错误

第一个:使用对的名称作为循环索引。这使得
pair
成为编译器抱怨的整数

第二份:您使用的是一份副本,而您需要两份,一份给制作人,另一份给消费者


编辑后

使用std::sync::{Arc,Mutex,Condvar};
fn生产者(对:&(互斥,Condvar),循环数:u32){
let(互斥,cv)=对;
//印刷品“生产”
}
fn使用者(对:&(互斥,Condvar),循环数:u32){
let(互斥,cv)=对;
//打印“消费”
}
pub fn run(){
println!(“Main::Begin”);
设_循环的数量=5;
设线程数=4;
让mut数组_of_threads=vec![];
让pair=Arc::new((Mutex::new(true),Condvar::new());
对于0中的u..num_线程{
让pair_clone1=pair.clone();
让pair_clone2=pair.clone();
push(std::thread::spawn(move | | | producer(&pair _clone1,num _循环)));
push(std::thread::spawn(move | | | consumer(&pair _clone2,num _循环)));
}
对于线程数组中的i{
i、 join().unwrap();
}
println!(“Main::End”);
}


请注意,我没有对代码质量给予任何关注。刚刚修复了编译错误

use std::sync::{Arc, Mutex, Condvar};
fn producer(pair: &(Mutex<bool>, Condvar), num_of_loops: u32) {
    let (mutex, cv) = pair;
    //prints "producing"

}

fn consumer(pair: &(Mutex<bool>, Condvar), num_of_loops: u32) {
    let (mutex, cv) = pair;
//prints "consuming"
}

pub fn run() {
    println!("Main::Begin");
    let num_of_loops = 5;
    let num_of_threads = 4;
    let mut array_of_threads = vec![];

    let pair = Arc ::new((Mutex::new(true), Condvar::new()));
    for _ in 0..num_of_threads {
        let pair_clone1 = pair.clone();
        let pair_clone2 = pair.clone();
        array_of_threads.push(std::thread::spawn( move || producer(&pair_clone1, num_of_loops)));
        array_of_threads.push(std::thread::spawn( move || consumer(&pair_clone2, num_of_loops)));
    }

    for i in array_of_threads {
        i.join().unwrap();
    }


    println!("Main::End");
}