동시성, 비동기

Mutex

하나의 자원을 공유할 때 사용, lock을 써서 스레드 내에서 변수를 점유, 스코프를 벗어나면 자동으로 unlock

자원을 래핑하여 락을 획득해야만 접근 허가

.lock(): 메서드로 락을 획득, 락이 걸려있으면 무한대기

.try_lock(): 획득에 실패하면 바로 리턴, 이때 리턴되는 값은 Result::Err

.into_inner(): 뮤텍스 객체를 소비하여 내부 데이터를 반환

MutexGuard

lock에 성공하면 반환되는 스마트 포인터

데이터에 변경가능 접근을 하며, 읽기전용 접근은 지원하지 않음

RwLock

읽기 전용 락과 쓰기 전용 락을 분리

.read(): 읽기전용 가드를 반환, 여럿이서 읽기 가능

.write(): 쓰기전용 가드를 반환, 한 명만 가질 수 있으며 한 명이라도 읽기 중이면 대기

세마포어

여러 자원을 보호하는데 사용, 소유권이 없으며 접근할 수 있는 권한의 수를 제한

보호할 자원을 객체 내부에두지않고 코드의 범위를 보호하는식으로 사용

따라서 허가권 없이 데이터 접근해도 체크 불가

std::thread

thread::spawn(impl FnOnce) -> JoinHandle

.join(): 스레드가 완료될 때까지 대기

.is_finished(): 실행이 완료되었는지 bool값으로 반환

join을 호출하지 않고 핸들 변수를 드롭시키면 스레드는 분리상태가 되어 죽지 않고 백그라운드에서 실행

thread::sleep(time::Duration)

동기식 슬립함수. 비동기 코드에서 호출시 다른 비동기 로직까지 멈춤

비동기 슬립함수는 크레이트마다 다르지만 가장 유명한 tokio의 슬립함수는 아래와 같음

tokio::time::sleep

async / await

async 키워드를 함수 선언이나 블록 앞에 붙여 호출시/평가시 Future 객체를 반환하는 비동기 함수로 선언

이그제큐터로 그 Future를 실행해야 함수/블록 내의 로직이 실행됨

await은 async 안에서, Future 트레이트를 구현한 요소에 대해서만 호출이 가능. 해당 요소가 블로킹되면 이그제큐터로 제어권을 넘겨 다른 비동기 코드가 실행되도록 함

std::sync::mpsc

mpsc::channel() -> (tx, rx)

tx: transmitter. .clone()으로 복제 가능

rx: receiver. 하나만 존재하며 복제 불가

tx.send(val)로 송신, rx.recv() 또는 rx.try_recv()로 수신

send 메서드는 Result<T,E> 타입을 반환

recv 메서드는 메인 스레드의 실행을 블록시키고 채널로부터 값을 받을 때까지 기다린 후, Result<T,E> 타입을 반환

try_recv 메서드는 메인 스레드의 실행을 블록시키지 않는 대신 즉시 Result<T,E>를 반환. .try_recv 를 매번 호출하는 루프를 작성하여 메시지가 올 때까지 다른 일 수행 가능