CRuby(MRI)는 GVL(Global VM Lock)로 인해 한 번에 하나의 스레드만 루비 코드를 실행할 수 있습니다. 이로 인해 CPU 집중적인 작업에서는 진정한 병렬 처리가 어렵습니다. 하지만 네트워크 요청, 파일 I/O, 데이터베이스 쿼리 등 I/O 바운드 작업 중에는 GVL이 해제되어 다른 스레드가 실행될 수 있으므로, 이러한 작업에서 스레드는 성능 향상에 크게 기여합니다.
스레드 사용 시 데이터 무결성을 위해 스레드 안전성(Thread Safety)을 고려해야 합니다. 여러 스레드가 공유 데이터에 동시에 접근할 때 발생하는 경쟁 조건(Race Condition)은 Mutex
를 사용하여 해결할 수 있습니다. mutex.synchronize
블록은 한 번에 하나의 스레드만 접근하도록 보장합니다.
실용적인 패턴으로 워커 풀(Worker Pool)이 있습니다. 이는 고정된 수의 스레드가 Queue
를 통해 작업을 처리하여 효율성을 높입니다. Queue
클래스는 스레드 안전성을 보장합니다. 또한, Thread.current
를 통해 스레드 로컬 스토리지(Thread-Local Storage)를 활용하여 각 스레드만의 독립적인 데이터를 저장할 수 있습니다. 스레드는 “run”, “sleep”, “aborting”, false
(정상 종료), nil
(예외 종료) 등의 상태를 가지며, alive?
와 value
메서드로 생명 주기를 관리할 수 있습니다.