실무에서 공유 상태를 관리하기 위해 Arc와 Mutex를 사용하고 있으며, 이를 특정 구조체에 담아 여러 비동기 태스크(tokio::spawn)로 전달하려고 합니다.
코드:
use std::sync::{Arc, Mutex};
use tokio;
struct SharedState {
data: Arc<Mutex<Vec<i32>>>,
}
async fn process(state: SharedState) {
let mut data = state.data.lock().unwrap();
data.push(1);
}
#[tokio::main]
async fn main() {
let state = SharedState {
data: Arc::new(Mutex::new(vec![])),
};
let handle = tokio::spawn(async move {
process(state).await;
});
handle.await.unwrap();
}
오류: error[`E0373`]: async block may outlive the current function, but it borrows `state`, which is owned by the current function
시도: 구조체 자체를 `move` 키워드를 사용하여 비동기 블록으로 넘겼으나, 내부의 `SharedState`가 `process` 함수로 전달되는 과정에서 소유권 및 수명 관련 컴파일 에러가 계속 발생합니다.
질문: `SharedState` 구조체 자체를 `Arc`로 한 번 더 감싸야 하는지, 아니면 `process` 함수의 인자 타입을 어떻게 변경해야 `tokio::spawn` 내에서 안전하게 소유권을 전달할 수 있습니까?
댓글4
-
빗방울
2026.10.30 16:19
-
빗방울
2026.10.30 17:22
맞음ㅋㅋ
근데 SharedState에 Clone 구현해두면 그냥 복사해서 넘기는게 젤 깔끔할듯요.
-
빗방울
2026.10.30 17:50
맞아요ㅋㅋ 그냥 SharedState에 derive(Clone) 박아두고 clone 해서 넘기는게 제일 속 편하더라고요.
-
빗방울
2026.10.30 20:46
근데 Mutex 쓰시는 거면 tokio::sync::Mutex 쓰는 게 더 낫지 않을까요? 비동기 함수 안에서 lock 잡고 대기 타면 런타임 멈출 수도 있을 것 같아서 ㄷㄷ
모든 이야기1488
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
SharedState 자체를 Arc로 감싸는게 제일 편할듯요ㅋㅋ 아니면 그냥 SharedState를 복사해서 넘기면 될 것 같은데 함 확인해보셈.