【发布时间】:2017-12-08 13:04:37
【问题描述】:
有什么好的方法可以调整这个Barrier 示例来处理两个差异:
事先不知道项目的数量(例如,在将大文件分成几行的情况下)
不跟踪线程句柄(例如,在下面的示例中不使用
handles向量)。这样做的动机是增加额外的开销。
示例代码:
use std::sync::{Arc, Barrier};
use std::thread;
let mut handles = Vec::with_capacity(10);
let barrier = Arc::new(Barrier::new(10));
for _ in 0..10 {
let c = barrier.clone();
handles.push(thread::spawn(move|| {
// do some work
c.wait();
}));
}
// Wait for other threads to finish.
for handle in handles {
handle.join().unwrap();
}
代码 sn-p 稍微改编自 Barrier docs。
我首先想到的是(如果可能的话)改变Barrier 的内在价值;但是,API 不提供对Barrier 结构的num_threads 属性的可变访问。
另一个想法是不使用Barrier,而是使用AtomicUsize 编写自定义逻辑。
我愿意在 Rust 中学习最符合人体工程学/惯用的方法。
【问题讨论】:
-
是在问如何在不跟踪线程同步机制的情况下同步线程?如果您想稍后加入它们,则必须将这些句柄保留在某个地方。由于向量是可调整大小的,那么制作和保持可变数量的句柄和屏障实例有什么问题?
标签: multithreading rust barrier