我正在解决线程环问题。在每个线程中,我读取令牌值。
如果不是我的令牌,则检查是否为程序的结尾。
- 如果是,则结束该线程。
- 否则,请重新读取并重复此过程。
如果是我的令牌(即具有我的 ID),则获取写锁,增加令牌值,检查是否为结尾,然后告诉主线程我已经完成,并结束当前线程循环。
如果还没有结束,则释放写锁,并开始重新读取。
没有解锁。这里是否有像我需要的解锁一样的东西?
似乎我也应该释放读锁,因为如果有人正在读取数据,则写锁将不会发生。这是必要的吗?
fn main() {
use std::sync::{Arc, RwLock};
use std::thread;
use std::sync::mpsc::channel;
const N: usize = 5; //503;
const STOP_POINT: usize = 100;
let n = Arc::new(RwLock::new(1));
let (sender, reciever) = channel();
for i in 1..N {
let (n_c, channel) = (n.clone(), sender.clone());
// println!("Thread n.{} beeing created!", i);
let a = thread::Builder::new()
.name(i.to_string())
.spawn(move || -> () {
loop {
let mut read_only = n_c.read().unwrap();
let say_my_name = (*thread::current().name().unwrap()).to_string();
// println!("Thread {} says: gonna try!", say_my_name);
while (*read_only % N) != i {
if *read_only == 0 {
break;
}
// println!("Thread {} says: aint mine!", say_my_name);
read_only = n_c.read().unwrap();
} // WAIT
println!("Thread {} says: my turn!", say_my_name);
let mut ref_to_num = n_c.write().unwrap();
*ref_to_num += 1;
if *ref_to_num == STOP_POINT {
channel.send(say_my_name).unwrap();
break;
}
}
()
});
assert_eq!(a.is_ok(), true);
// thread::spawn();
// println!("Thread n.{} created!", i);
}
println!("{}", reciever.recv().unwrap());
}