1

在此代码示例中,来自r2d2 的 Github 页面

fn main() {
    let manager = r2d2_foodb::FooConnectionManager::new("localhost:1234");
    let pool = r2d2::Pool::builder()
        .max_size(15)
        .build(manager)
        .unwrap();

    for _ in 0..20 {
        let pool = pool.clone();
        thread::spawn(move || {
            let conn = pool.get().unwrap();
        })
    }
}

为什么Pool结构在循环中被克隆?

4

1 回答 1

5

这是因为在循环内产生的线程需要获得 的所有权pool,因为每个线程可以运行的时间比main. 如果在线程仍在运行时退出,从线程内部引用pool所拥有的main可能会导致引用已经被销毁的值。main

获得所有权pool需要您在每次循环执行时克隆它,因此每个线程都有自己的副本。

在内部, aPool是 anstd::sync::Arc并且Clone实现只是简单地克隆了Arc. 也就是说,每个克隆Pool只是一个递增的引用计数。随着线程的创建,引用计数增加。当线程完成时,它们通过删除它们来减少引用计数,Pool当引用计数达到零时破坏底层连接。

于 2021-02-27T15:55:54.027 回答