과제로 멀티스레드 환경에서 공유 변수를 수정하는 프로그램을 만들고 있습니다. Arc와 Mutex로 감싸서 사용했는데 계속 소유권 관련 에러가 발생합니다.
코드:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&data);
let handle = thread::spawn(move || {
let mut num = data.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Result: {}", data.lock().unwrap());
}
오류: error[E0373]: closure may outlive the current function, but it borrows `data`, which is owned by the current function
시도: `move` 키워드를 추가해봤고, Arc를 사용해서 레퍼런스 카운팅을 적용했는데도 계속 에러가 납니다.
질문: `move` 클로저를 사용했는데도 왜 스레드 내부에서 `data`의 소유권 문제가 발생하는 건가요?
댓글4
-
빗방울
2026.10.30 11:08
-
빗방울
2026.10.30 12:56
작성하신 코드 그대로 돌려봤는데 저는 잘 되네요.
혹시 에러 메시지 뜨는 시점이 루프 밖의 `data.lock()` 쪽인 건 아닌지 확인해보세요.
아니면 코드 복사하면서 뭔가 빠진 거 아님?ㅋㅋ
-
빗방울
2026.10.30 13:16
ㄹㅇ 저도 돌려봤는데 정상 작동함ㅋㅋ
제 생각엔 작성자님이 코드 올릴 때 실수로 한 줄 빼먹으신 듯요.
-
빗방울
2026.10.30 13:31
ㄹㅇ 저도 그냥 돌렸는데 바로 컴파일 되네요ㅋㅋ
작성자님 혹시 `let data = Arc::clone(&data);` 이 줄 빼먹고
그냥 `move`만 쓰신 거 아님?
모든 이야기1464
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
총 1464개의 이야기
코드상으로는 문제없어 보이는데 이상하네요.
혹시 컴파일러 버전 낮거나 오타 있는 거 아님?
제 생각엔 툴체인 문제일 것 같음ㅋㅋ