본문으로 바로가기
COMMUNITY모든 이야기

실무에서 공유 상태를 관리하기 위해 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` 내에서 안전하게 소유권을 전달할 수 있습니까?

모든 이야기1488

가벼운 안부부터 깊은 생각까지, 함께 나눠요.

글쓰기
총 1488개의 이야기
댓글