Rust lazy_static 变量 RwLock 访问
Rust lazy_static variable RwLock access
我正在尝试声明和 read/write 一个自定义结构的实例,使用 lazy_static
因为我必须在其初始化(字符串)时使用非常量函数。
正如我在另一个 Whosebug here 中看到的那样 post,我尝试使用 RwLock,它在写入时工作正常,但在读取时失败,并出现以下错误:
thread 'main' panicked at 'rwlock read lock would result in deadlock', /Users/adrien/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/sys/unix/rwlock.rs:47:13
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
pub struct Authentication {
access_token: String,
refresh_token: String,
expiration: u32
}
lazy_static! {
static ref LATEST_AUTH: RwLock<Authentication> = RwLock::new(Authentication {
access_token: "access".to_string(),
refresh_token: "refresh".to_string(),
expiration: 0
});
}
pub fn auth(){
let api_resp: ApiResponse = res.json().unwrap(); //From a reqwest res
let mut au = LATEST_AUTH.write().unwrap();
au.access_token = api_resp.access_token.clone();
println!("LATEST_AUTH:{}", LATEST_AUTH.read().unwrap()); //Fails
}
A RwLock
在锁守卫的整个范围内被锁定,这是通过调用 read()
或 write()
.
获得的
在您的例子中,写锁防护 au
在 auth
函数的整个持续时间内都存在。这就是错误的意思:你已经锁定了它,然后试图在同一个线程中再次锁定它会使它永远阻塞。
写锁也可以用于读,所以你可以通过 re-using 解决这个问题,而不是再次尝试锁定它:
pub fn auth(){
let api_resp: ApiResponse = res.json().unwrap();
let mut au = LATEST_AUTH.write().unwrap();
au.access_token = api_resp.access_token.clone();
println!("LATEST_AUTH:{}", au);
}
或者,你可以强制早点掉锁,这样你就可以锁定它单独读取:
pub fn auth(){
let api_resp: ApiResponse = res.json().unwrap();
let mut au = LATEST_AUTH.write().unwrap();
au.access_token = api_resp.access_token.clone();
std::mem::drop(au);
println!("LATEST_AUTH:{}", LATEST_AUTH.read().unwrap());
}
或:
pub fn auth(){
let api_resp: ApiResponse = res.json().unwrap();
// a new scope
{
let mut au = LATEST_AUTH.write().unwrap();
au.access_token = api_resp.access_token.clone();
// au will be dropped here, when it goes out of scope
}
println!("LATEST_AUTH:{}", LATEST_AUTH.read().unwrap());
}
我正在尝试声明和 read/write 一个自定义结构的实例,使用 lazy_static
因为我必须在其初始化(字符串)时使用非常量函数。
正如我在另一个 Whosebug here 中看到的那样 post,我尝试使用 RwLock,它在写入时工作正常,但在读取时失败,并出现以下错误:
thread 'main' panicked at 'rwlock read lock would result in deadlock', /Users/adrien/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/sys/unix/rwlock.rs:47:13
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
pub struct Authentication {
access_token: String,
refresh_token: String,
expiration: u32
}
lazy_static! {
static ref LATEST_AUTH: RwLock<Authentication> = RwLock::new(Authentication {
access_token: "access".to_string(),
refresh_token: "refresh".to_string(),
expiration: 0
});
}
pub fn auth(){
let api_resp: ApiResponse = res.json().unwrap(); //From a reqwest res
let mut au = LATEST_AUTH.write().unwrap();
au.access_token = api_resp.access_token.clone();
println!("LATEST_AUTH:{}", LATEST_AUTH.read().unwrap()); //Fails
}
A RwLock
在锁守卫的整个范围内被锁定,这是通过调用 read()
或 write()
.
在您的例子中,写锁防护 au
在 auth
函数的整个持续时间内都存在。这就是错误的意思:你已经锁定了它,然后试图在同一个线程中再次锁定它会使它永远阻塞。
写锁也可以用于读,所以你可以通过 re-using 解决这个问题,而不是再次尝试锁定它:
pub fn auth(){
let api_resp: ApiResponse = res.json().unwrap();
let mut au = LATEST_AUTH.write().unwrap();
au.access_token = api_resp.access_token.clone();
println!("LATEST_AUTH:{}", au);
}
或者,你可以强制早点掉锁,这样你就可以锁定它单独读取:
pub fn auth(){
let api_resp: ApiResponse = res.json().unwrap();
let mut au = LATEST_AUTH.write().unwrap();
au.access_token = api_resp.access_token.clone();
std::mem::drop(au);
println!("LATEST_AUTH:{}", LATEST_AUTH.read().unwrap());
}
或:
pub fn auth(){
let api_resp: ApiResponse = res.json().unwrap();
// a new scope
{
let mut au = LATEST_AUTH.write().unwrap();
au.access_token = api_resp.access_token.clone();
// au will be dropped here, when it goes out of scope
}
println!("LATEST_AUTH:{}", LATEST_AUTH.read().unwrap());
}