하나의 자원을 공유할 때 사용, lock을 써서 스레드 내에서 변수를 점유, 스코프를 벗어나면 자동으로 unlock
자원을 래핑하여 락을 획득해야만 접근 허가
.lock(): 메서드로 락을 획득, 락이 걸려있으면 무한대기
.try_lock(): 획득에 실패하면 바로 리턴, 이때 리턴되는 값은 Result::Err
.into_inner(): 뮤텍스 객체를 소비하여 내부 데이터를 반환
lock에 성공하면 반환되는 스마트 포인터
데이터에 변경가능 접근을 하며, 읽기전용 접근은 지원하지 않음
읽기 전용 락과 쓰기 전용 락을 분리
.read(): 읽기전용 가드를 반환, 여럿이서 읽기 가능
.write(): 쓰기전용 가드를 반환, 한 명만 가질 수 있으며 한 명이라도 읽기 중이면 대기
여러 자원을 보호하는데 사용, 소유권이 없으며 접근할 수 있는 권한의 수를 제한
보호할 자원을 객체 내부에두지않고 코드의 범위를 보호하는식으로 사용
따라서 허가권 없이 데이터 접근해도 체크 불가
.join(): 스레드가 완료될 때까지 대기
.is_finished(): 실행이 완료되었는지 bool값으로 반환
join을 호출하지 않고 핸들 변수를 드롭시키면 스레드는 분리상태가 되어 죽지 않고 백그라운드에서 실행
동기식 슬립함수. 비동기 코드에서 호출시 다른 비동기 로직까지 멈춤
비동기 슬립함수는 크레이트마다 다르지만 가장 유명한 tokio의 슬립함수는 아래와 같음
async 키워드를 함수 선언이나 블록 앞에 붙여 호출시/평가시 Future 객체를 반환하는 비동기 함수로 선언
이그제큐터로 그 Future를 실행해야 함수/블록 내의 로직이 실행됨
await은 async 안에서, Future 트레이트를 구현한 요소에 대해서만 호출이 가능. 해당 요소가 블로킹되면 이그제큐터로 제어권을 넘겨 다른 비동기 코드가 실행되도록 함
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 를 매번 호출하는 루프를 작성하여 메시지가 올 때까지 다른 일 수행 가능