this post was submitted on 15 Jun 2023
187 points (93.9% liked)
Programming
17540 readers
88 users here now
Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!
Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.
Hope you enjoy the instance!
Rules
Rules
- Follow the programming.dev instance rules
- Keep content related to programming in some way
- If you're posting long videos try to add in some form of tldr for those who don't want to watch videos
Wormhole
Follow the wormhole through a path of communities [email protected]
founded 2 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
Only for things that you specifically want shared between threads – namely this (synchronized refcount) is an
std::sync::Arc
. What you want to share really depends on the app; in database-backed web services it's quite common to have pretty much zero state shared across threads. Multithreaded environment doesn't imply sharing!The refcount absolutely is shared state across threads.
If Thread#1 thinks the refcount is 5, but Thread#2 thinks the refcount is 0, you've got problems.
Again, only for things that you specifically want shared between threads.
There's no "the" refcount in Rust, anyhow. If you just instantiate some container or your custom data struct, like
let mut x = Vec::new();
– it's very local to where you are, it's on the stack, it's not reference counted at runtime at all, you cannot pass it between threads (if it's notSend
it cannot EVER cross a thread boundary in safe Rust). The standard library provides two ref-counter containers.Rc
is just a basic refcount that is not thread-safe and thus also is notSend
and won't ever be allowed to cross the thread boundary in safe Rust.Arc
implements atomic-based thread-safe ref-counting and thus isSend
, implementing what you're talking about, but as an opt-in per-object container, not as some behind-the-scenes global feature.