Skip to content

Commit 19687bc

Browse files
Refactor threads to use Weak references for graceful termination
- Replaced strong Arc clones with Weak references in thread spawns - Ensured threads terminate when the associated Arc is dropped
1 parent 4633061 commit 19687bc

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

examples/turtlesim_rs/src/turtle_frame.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,14 @@ impl<'a> TurtleFrame<'a> {
161161
)
162162
.unwrap();
163163

164-
let nh_clone = Arc::clone(&nh);
164+
let nh_weak = Arc::downgrade(&nh);
165165
thread::spawn(move || loop {
166166
std::thread::sleep(time::Duration::from_millis(UPDATE_INTERVAL_MS / 2));
167-
let _v = rclrs::spin_once(nh_clone.clone(), Some(time::Duration::ZERO));
167+
if let Some(nh_clone) = nh_weak.upgrade() {
168+
let _ = rclrs::spin_once(nh_clone, Some(time::Duration::ZERO));
169+
} else {
170+
break;
171+
}
168172
});
169173

170174
TurtleFrame {

examples/turtlesim_rs/src/turtlesim.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,17 @@ impl MyEguiApp {
4141

4242
let turtle_frame = Arc::new(Mutex::new(turtle_frame));
4343

44-
let turtle_frame_clone = Arc::clone(&turtle_frame);
44+
let turtle_frame_weak = Arc::downgrade(&turtle_frame);
45+
4546
thread::spawn(move || loop {
4647
std::thread::sleep(time::Duration::from_millis(UPDATE_INTERVAL_MS));
47-
let mut frame = turtle_frame_clone.lock().unwrap();
48-
frame.update_turtles();
49-
frame.handle_service_requests();
48+
if let Some(turtle_frame_clone) = turtle_frame_weak.upgrade() {
49+
let mut frame = turtle_frame_clone.lock().unwrap();
50+
frame.update_turtles();
51+
frame.handle_service_requests();
52+
} else {
53+
break;
54+
}
5055
});
5156

5257
MyEguiApp { turtle_frame }

0 commit comments

Comments
 (0)