면접 준비하면서 멀티스레딩 구현 연습 중인데, 공유 상태를 수정하려고 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_clone = Arc::clone(&data);
let handle = thread::spawn(move || {
let mut num = data_clone.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Result: {}", *data.lock().unwrap());
}
오류: error[E0382]: use of moved value: `data`
note. expected due to move in loop
시도: Arc::clone을 사용해서 각 스레드에 넘겨줬고, move 클로저도 사용해봤습니다.
질문: 분명 Arc로 참조 횟수를 관리해서 복사본을 넘겨줬는데 왜 메인 함수에서 data가 이동되었다고 나오는지 모르겠어요.
댓글7
-
빗방울
2026.10.30 12:40
-
빗방울
2026.10.30 13:24
코드 보면 루프 안에서 clone 잘 하신 거 같은데
이상하네요. 혹시 컴파일러가 가리키는 에러 라인 다시 확인해보셈.
가끔 엉뚱한 곳에서 터질 때 있음ㅋㅋ
-
빗방울
2026.10.30 13:50
그니까요. 코드상으론 문제 없어 보이는데
제 생각엔 `data` 변수 자체가 루프 어딘가에서 캡처된 거 아닐까요
진짜 러스트는 뇌절 올 때 많음ㅋㅋ
-
빗방울
2026.10.30 14:56
맞아요.
근데 이거 왠지 에러 메시지 보면 엉뚱한 곳 짚어주는 경우 많더라고요ㅋㅋ
제 생각엔 move 클로저가 생각보다 공격적으로 캡처해서 그런 것 같음.
-
빗방울
2026.10.30 15:00
근데 이거 코드상으로는 문제 없어 보이는데 이상하네요.
혹시 질문자님 로컬 환경에서 코드 수정하고 저장 안 하신 거 아님?ㅋㅋ
저도 처음에 이런 걸로 한 시간 삽질한 적 있어서 남일 같지 않음ㄷㄷ
-
빗방울
2026.10.30 15:31
이거 혹시 루프 밖에서 `data`를 직접 캡처해서 그런 거 아님?
`data_clone` 말고 원본 `data`가 move 됐다고 뜨는 거 보면 묘하네요ㅋㅋ
컴파일러가 짚어주는 정확한 라인 번호 좀 알려주셈ㄷㄷ
-
빗방울
2026.10.30 17:22
근데 이거 코드 그대로 돌려봤는데 잘 돌아가는데요ㅋㅋ
혹시 루프 밖에서 `data`를 또 쓰신 곳이 있거나
에러 메시지 뜬 정확한 줄 번호 다시 확인해보셈ㄷㄷ
모든 이야기1454
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
코드 보니까 루프 밖에서 data_clone 만드는 위치가 문제인듯요.
clone을 루프 안에서 하고 계신데 혹시 괄호나 위치 다시 확인해보셈.
러스트 빌로우체커 진짜 킹받네요ㅋㅋ