[Rust] spawn와 scope의 차이 (std::thread): 개념과 예제

[Rust] spawn와 scope의 차이 (std::thread): 개념과 예제

Rust/Libraries
민호이 민호이 2025. 1. 13. 01:24
목차
  1. Spawn과 Scope의 차이점
  2. 1. Spawn
  3. 1.1. 주요 특징
  4. 1.2. 예제
  5. 1.3. 한계
  6. 2. Scope
  7. 2.1. 주요 특징
  8. 2.2. 예제
  9. 2.3. 장점
  10. 3. Spawn과 Scope의 주요 차이점 비교
  11. F&Q
  12. 결론

Spawn과 Scope의 차이점

Rust의 std::thread 모듈은 멀티스레딩을 지원하며, 이를 통해 프로그램의 작업을 병렬적으로 수행할 수 있습니다. 이 모듈에서 가장 많이 사용되는 두 가지 함수는 spawn과 scope입니다. 두 함수 모두 스레드를 생성하고 관리할 수 있지만, 각각의 동작 방식과 용도는 다릅니다.


1. Spawn

thread::spawn은 새로운 스레드를 생성하고 해당 스레드에서 특정 작업을 실행하도록 합니다.

1.1. 주요 특징

  • 독립적인 스레드: 생성된 스레드는 부모 스레드와 독립적으로 동작하며, 실행 순서를 부모 스레드와 조정하지 않습니다.
  • 'static 라이프타임 요구: spawn 함수는 스레드에서 실행할 클로저가 'static 라이프타임을 가져야 합니다. 즉, 클로저 내에서 사용되는 변수들은 힙에 저장되거나 소유권이 스레드로 이전되어야 합니다.
  • JoinHandle 반환: spawn은 스레드가 종료될 때 반환되는 값을 포함하는 JoinHandle을 반환합니다.

1.2. 예제

use std::thread;
fn main() {
let handle = thread::spawn(|| {
for i in 1..5 {
println!("Thread: {}", i);
}
});
// 메인 스레드 작업
for i in 1..5 {
println!("Main: {}", i);
}
handle.join().unwrap(); // 스레드가 끝날 때까지 기다림
}

1.3. 한계

  • 스레드 간 데이터 공유가 어렵고, 'static 제약으로 인해 클로저 내에서 지역 변수에 접근하는 데 제약이 있음.

2. Scope

std::thread::scope는 최신 Rust에서 제공하는 함수로, 클로저가 특정 범위 내에서 실행되도록 보장합니다.

2.1. 주요 특징

  • 스레드 수명 제한: 생성된 스레드는 scope 블록의 생명주기 내에서만 유효합니다. 따라서 'static 제약이 필요하지 않으며, 지역 변수 참조가 가능합니다.
  • 안전한 데이터 접근: 지역 변수를 스레드에서 안전하게 공유할 수 있어, 데이터 소유권 이전이 필요 없습니다.
  • 결정적 종료: 모든 스레드가 종료된 후에 scope 블록을 빠져나갈 수 있습니다.

2.2. 예제

use std::thread;
fn main() {
let data = vec![1, 2, 3, 4];
thread::scope(|s| {
s.spawn(|| {
println!("Thread 1: {:?}", data);
});
s.spawn(|| {
println!("Thread 2: {:?}", data);
});
}); // 모든 스레드가 종료된 후 이 블록을 빠져나감
}

2.3. 장점

  • 지역 데이터를 공유하며 동작하는 스레드를 안전하게 실행.
  • 'static 요구 사항이 없어서 사용이 더 간편.

3. Spawn과 Scope의 주요 차이점 비교

기능 spawn scope
라이프타임 'static 데이터만 허용 지역 변수 참조 가능
스레드 종료 명시적으로 join 호출 필요 블록 종료 시 모든 스레드 종료 보장
데이터 공유 데이터 소유권 이전 필요 안전한 참조로 지역 데이터 공유 가능
사용 시기 독립적이고 긴 생명주기를 가진 작업 지역 변수와 밀접한 병렬 작업에 적합
오버헤드 더 자유롭지만 잠재적 위험 존재 더 안전하지만 블록 내로 제한됨

F&Q

Q1: 왜 spawn은 'static 제한이 필요한가요?

  • spawn에서 생성된 스레드는 부모 스레드보다 오래 실행될 수 있습니다. 따라서 힙에 저장된 데이터만 접근하도록 제한하는 'static 제약이 필요합니다.

Q2: 언제 scope를 사용해야 하나요?

  • 스레드가 특정 블록 내에서만 동작해야 하거나, 지역 데이터를 여러 스레드가 공유할 때 scope가 적합합니다.

Q3: scope가 항상 더 안전한가요?

  • scope는 데이터 공유와 스레드 수명 관리에서 안전하지만, spawn에 비해 유연성이 떨어질 수 있습니다.

결론

spawn과 scope는 각각의 장단점을 가지며, 작업의 성격에 따라 선택적으로 사용해야 합니다. 독립적인 작업에는 spawn, 블록 내 안전한 병렬 처리가 필요하다면 scope를 활용하세요.

저작자표시 비영리 변경금지 (새창열림)
  1. Spawn과 Scope의 차이점
  2. 1. Spawn
  3. 1.1. 주요 특징
  4. 1.2. 예제
  5. 1.3. 한계
  6. 2. Scope
  7. 2.1. 주요 특징
  8. 2.2. 예제
  9. 2.3. 장점
  10. 3. Spawn과 Scope의 주요 차이점 비교
  11. F&Q
  12. 결론
'Rust/Libraries' 카테고리의 다른 글
  • [Rust] HashMap, HashSet 전격 비교, 차이점
  • [Rust] Arc, Mutex: 개념과 예제, 사용법
  • [Rust] Box 활용 완벽 정리: 예제, 메소드
  • [Rust] std::f64의 메소드 소개 (abs, exp, log, MIN, MAX)
민호이
민호이
민호이
ChungCODE
민호이
전체
오늘
어제
  • Categories (128)
    • 스포츠 (6)
    • 인공지능 (5)
    • 주식 (6)
      • 경제 주식 전망 (5)
      • ETF (9)
    • CSAPP (4)
      • Lab Session (4)
      • Concepts (0)
    • C (19)
    • Java (24)
    • Rust (44)
      • Concepts (27)
      • Libraries (17)
    • PS (2)
    • 국내 소식 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • c++
  • 유클리드 호제법
  • 최대공약수
  • 알고리즘
  • 최소공배수
  • 코드업
  • 수학
  • C

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.v4.2.1
민호이
[Rust] spawn와 scope의 차이 (std::thread): 개념과 예제
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.