在Rust中线程之间共享无锁资源



我正在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);

但这是值得的。

不知道性能损失会是多少,您只需要尝试一下。

最新更新