有没有比RwLock更低级的替代方案?

huangapple go评论102阅读模式
英文:

Is there a lower-level alternative to RwLock?

问题

在我的较低级别库中,我想要一个RwLock的功能,但是不想持有RwLockReadGuardRwLockWriteGuard,而是想要手动告诉RwLock-类似的对象何时释放读取或写入锁定。

在std中是否有可移植的公共接口来实现这个,即使是不安全的?

英文:

In my low-ish level library, I want the functionality of a RwLock, but instead of holding a RwLockReadGuard or RwLockWriteGuard, I want to manually tell the RwLock-like object when the read or write lock has been released.

Is there portable public interface in std for this, even if unsafe?

答案1

得分: 2

不在标准库中(尽管您可以使用 RwLock<()>,但仍需持有守卫),但在 parking_lot 中有 RawRwLock

  1. use parking_lot::lock_api::RawRwLock as _;
  2. use parking_lot::RawRwLock;
  3. let rwlock = RawRwLock::INIT;
  4. // 写访问
  5. rwlock.lock_exclusive();
  6. // 进行操作
  7. unsafe {
  8. rwlock.unlock_exclusive();
  9. }
  10. // 读访问
  11. rwlock.lock_shared();
  12. // 进行操作
  13. unsafe {
  14. rwlock.unlock_shared();
  15. }
英文:

Not in std (although you can use RwLock<()>, but you still have to hold the guard around), but in parking_lot there is RawRwLock:

  1. use parking_lot::lock_api::RawRwLock as _;
  2. use parking_lot::RawRwLock;
  3. let rwlock = RawRwLock::INIT;
  4. // Write access
  5. rwlock.lock_exclusive();
  6. // Do work
  7. unsafe {
  8. rwlock.unlock_exclusive();
  9. }
  10. // Read access
  11. rwlock.lock_shared();
  12. // Do work
  13. unsafe {
  14. rwlock.unlock_shared();
  15. }

答案2

得分: 1

你可以始终这样做:

  1. let lock = RwLock::new(0);
  2. let mut guard = lock.write().unwrap();
  3. *guard += 1;
  4. drop(guard);
  5. // lock is unlocked now.
  6. let guard = lock.read().unwrap();
  7. println!("{}", *guard);
  8. drop(guard);
  9. // lock is unlocked now.
英文:

You always can do this:

  1. let lock = RwLock::new(0);
  2. let mut guard = lock.write().unwrap();
  3. *guard += 1;
  4. drop(guard);
  5. // lock is unlocked now.
  6. let guard = lock.read().unwrap();
  7. println!("{}", *guard);
  8. drop(guard);
  9. // lock is unlocked now.

huangapple
  • 本文由 发表于 2023年5月21日 19:49:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/76299769.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定