개발/Rust

Rust의 스레딩 모델과 std::thread 알아보기

njsung 2023. 6. 16. 09:39
반응형
728x90

Introduction

프로그래밍에서 스레딩은 런타임 성능을 최적화하고, 복잡한 문제를 풀기 위한 중요한 도구입니다. Rust에서는 이러한 작업을 안전하고 효과적으로 수행할 수 있도록 많은 기능을 제공합니다. 이 포스트에서는 Rust의 스레딩 모델과 std::thread 라이브러리를 중점적으로 살펴보겠습니다.

 

SMALL

Rust의 스레딩 모델

Rust의 스레딩 모델은 1:1 모델을 따릅니다. 이는 각각의 Rust 스레드가 하나의 운영체제 스레드에 직접 매핑된다는 것을 의미합니다. 이렇게 함으로써 Rust는 운영체제의 기본 스레딩 기능을 최대한 활용할 수 있습니다. 또한 이 모델은 운영체제 스레드와 같은 성능을 제공하며, 운영체제의 스케줄링과 스레드 간 통신 기능을 이용할 수 있습니다.

 

std::thread

Rust의 std::thread 라이브러리는 스레드를 생성하고 관리하는 기본적인 기능을 제공합니다.

 

1. 스레드 생성

std::thread::spawn 함수를 사용하면 새로운 스레드를 생성할 수 있습니다. 이 함수는 클로저를 인자로 받아, 새로 생성된 스레드에서 실행됩니다.

2. 스레드 조인
스레드가 종료될 때까지 기다리는 것을 "조인"이라고 합니다. std::thread::spawn 함수는 JoinHandle을 반환하는데, 이를 통해 join 메소드를 호출할 수 있습니다. 이 메서드는 스레드가 종료될 때까지 호출한 스레드를 차단합니다.

3. 스레드의 식별자
std::thread::current().id()를 사용하면 현재 스레드의 ID를 가져올 수 있습니다. 이 ID는 운영체제에서 할당한 고유한 식별자로, 로깅 또는 디버깅에 유용합니다.

4. 스레드의 이름
Rust에서는 스레드에 이름을 붙일 수 있습니다. std::thread::Builder를 사용하여 스레드를 생성할 때 name 메서드를 사용하면 스레드에 이름을 지정할 수 있습니다. 또한 std::thread::current().name()을 통해 현재 스레드의 이름을 가져올 수 있습니다.

 

5. 1~4번 기능을 사용하는 예제

use std::thread;

fn main() {
    let builder = thread::Builder::new().name("thread1".into());

    let new_thread = builder.spawn(|| {
        println!("Thread name: {:?}", thread::current().name());
        //Thread name: thread1
    }).unwrap();

    new_thread.join().expect("Thread had an error");
}

 

Summary

Rust의 스레딩 기능은 강력하며, 복잡한 병렬 처리 작업을 안전하게 처리할 수 있습니다. 이 글을 통해 std::thread의 기능과 사용법에 대해 더 잘 이해하게 되었기를 바랍니다. 이제 이러한 지식을 바탕으로 더욱 복잡하고 효율적인 병렬 코드를 작성해 보세요!

반응형