multithreading - 为什么在此克隆连接池?

标签 multithreading rust r2d2

在此代码示例中,来自Github page of r2d2:

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结构?

最佳答案

这是因为循环内产生的线程需要拥有pool的所有权,因为每个线程的运行时间可能比main更长。如果在线程仍在运行时退出pool,则从线程内部引用main拥有的main可能导致引用已被销毁的值。
要获得pool的所有权,您需要在每次循环执行时将其克隆,因此每个线程都有自己的副本。
在内部,Poolstd::sync::Arc,并且Clone实现只是克隆Arc。也就是说,Pool的每个克隆只是一个递增的引用计数。创建线程后,引用计数会增加。当线程完成时,它们通过删除其Pool来减少引用计数,并在引用计数达到零时破坏基础连接。

关于multithreading - 为什么在此克隆连接池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66400432/

相关文章:

java - 我的线程无法唤醒

python - 如何立即退出Python程序但仍让线程完成

rust - 如何使Travis-CI使用x86_64-pc-windows-msvc构建Rust二进制文件?

rust - 我的空 Rust 项目无法编译,我该怎么办?

rust - 如何从 std::cmp::Reverse::<T> 获取 T 值

c++ - SIGSEGV 不终止进程

c# - System.Timers.Timer在Azure辅助角色中徘徊

mongodb - 如何通过r2d2和actix在MongoDB中保存文档?

sqlite - 如何从多个线程通过 rusqlite 使用 SQLite?