피드로 돌아가기
Three Threads, One Terminal: Concurrency in Rust with Channels and Atomics
Dev.toDev.to
Backend

broll이 std::thread::spawn과 mpsc 채널, Arc를 활용하여 터미널 녹음 중 키입력·화면 출력·DB 저장을 세 스레드로 동시 처리하는 구조를 설명한다

Three Threads, One Terminal: Concurrency in Rust with Channels and Atomics

Rodrigo Mello2026년 3월 30일11intermediate

Context

터미널 세션 녹음 도구 broll은 키입력을 셸에 전달하고, 셸 출력을 화면에 표시하며, 데이터를 SQLite에 저장하는 세 가지 작업을 동시에 수행해야 한다. 순차 처리 시 키입력 누락과 렌더링 지연이 발생한다.

Technical Solution

  • stdin 스레드 → std::thread::spawn과 move 클로저로 PTY 마스터에 키입력을 전달한다
  • 메인 스레드 → PTY 마스터를 읽어 실시간 stdout 출력과 mpsc 채널 전송을 동시에 수행한다
  • 저장 스레드 → mpsc::channel로 수신한 데이터를 OSC 마커 파싱 후 SQLite에 기록한다
  • 스레드 간 공유 상태 → Arc로 AtomicBool 신호 플래그와 AtomicU16 윈도우 크기를 안전하게 접근한다
  • Graceful 종료 → drop(tx)로 채널을 닫아 rx의 Disconnected 에러를 트리거한다

Impact

별도 async 런타임 의존 없이 std::thread와 std::sync만으로 세 스레드 동시성을 구현한다.

Key Takeaway

Rust의 소유권 시스템이 컴파일 타임에 스레드 안전성을 보장하며, move 클로저와 채널 종료를 통한 명시적 drop 순서가 정확성을 결정한다.


터미널 세션 녹음 환경에서 키입력·화면 출력·DB 저장을 동시에 처리할 때 std::thread::spawn으로 move 클로저 스레드 세 개를 생성하고 mpsc::channel로 메인→저장 스레드 간 데이터 흐름을 구성하면 비동기 런타임 없이도 안정적인 동시성을 확보할 수 있다

원문 읽기