不知道性能损失会是多少,您只需要尝试一下。
我正在Rust中移植我的c++象棋引擎。我有一个大的哈希表在搜索线程之间共享,在c++版本中,这个表是无锁的;没有互斥锁用于共享读写访问。如果你感兴趣的话,这是我的理论。
在这段代码的Rust版本中,它工作得很好,但是使用了Mutex
:
let shared_hash = Arc::new(Mutex::new(new_hash()));
for _ in 0..n_cpu {
println!("start thread");
let my_hash = shared_hash.clone();
thread_pool.push(thread::spawn(move || {
let mut my_hash = my_hash.lock().unwrap();
let mut search_engine = SearchEngine::new();
search_engine.search(&mut myhash);
}));
}
for i in thread_pool {
let _ = i.join();
}
如果没有互斥锁,我怎么能在线程之间共享表呢? 实际上很简单:如果底层结构已经是Sync
,则Mutex
是不必要的。
在您的例子中,可以使用原子结构体的数组。你可以在这里找到Rust可用的原子。
数据竞争在c++和Rust中都是未定义的行为。说不就好。
正确的方法是用原子整数构建表。这是火箭科学。你必须逐个决定你有多在意内存操作的顺序。这会使你的代码混乱:
// non-atomic array access
table[h] = 0;
// atomic array access
table[h].store(0, Ordering::SeqCst);
但这是值得的。