Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

겁 없는 동시성

동시성 프로그래밍을 안전하고 효율적으로 다루는 것은 러스트의 또 다른 중요한 목표입니다. 동시성 프로그래밍(concurrent programming) 은 프로그램의 서로 다른 부분이 독립적으로 실행되는 것을 뜻하고, 병렬 프로그래밍(parallel programming) 은 프로그램의 서로 다른 부분이 실제로 동시에 실행되는 것을 뜻합니다. 여러 프로세서를 활용하는 컴퓨터가 점점 늘어남에 따라, 이런 주제는 점점 더 중요해지고 있습니다. 역사적으로 이런 맥락의 프로그래밍은 어렵고 오류가 많았습니다. 러스트는 그것을 바꾸고자 합니다.

처음에 러스트 팀은 메모리 안전성과 동시성 문제 예방을 서로 다른 방법으로 풀어야 하는 별개의 과제라고 생각했습니다. 하지만 시간이 지나며, 소유권 시스템과 타입 시스템이 메모리 안전성 동시성 문제를 함께 다루는 강력한 도구라는 사실을 알게 되었습니다! 러스트는 소유권과 타입 검사를 활용해 많은 동시성 오류를 런타임 에러가 아니라 컴파일 타임 에러로 만들어 줍니다. 덕분에 런타임 동시성 버그가 정확히 어떤 조건에서 재현되는지 오랜 시간 추적하는 대신, 잘못된 코드는 아예 컴파일되지 않고 문제를 설명하는 오류 메시지를 보여 줍니다. 그 결과, 코드를 작성하는 도중에 문제를 고칠 수 있고, 배포한 뒤에야 버그를 잡게 되는 일을 줄일 수 있습니다. 우리는 러스트의 이런 면을 겁 없는 동시성(fearless concurrency) 이라고 부릅니다. 겁 없는 동시성 덕분에 미묘한 버그가 없고, 리팩터링해도 새 버그를 만들 가능성이 적은 코드를 작성할 수 있습니다.

Note: 편의를 위해 이 장에서는 많은 문제를 그냥 동시성 문제 라고 부르겠습니다. 더 정확히 말하면 동시성 및/또는 병렬성 문제라고 해야 하지만, 이 장에서는 “동시성” 이라는 말을 볼 때마다 머릿속으로 “동시성 및/또는 병렬성”이라고 치환해 생각하면 됩니다. 다음 장에서는 이 구분이 더 중요해지므로, 그때는 좀 더 엄밀하게 구분해 말하겠습니다.

많은 언어는 동시성 문제를 해결하는 방식에 대해 어느 정도 교조적인 태도를 가집니다. 예를 들어 Erlang은 메시지 전달 기반 동시성을 매우 우아하게 지원하지만, 스레드 간 상태를 공유하는 방법은 훨씬 덜 직관적입니다. 가능한 해결책 일부만 지원하는 것은 고수준 언어에서는 꽤 합리적인 전략입니다. 더 많은 추상화를 얻는 대신 제어권 일부를 포기하겠다고 약속하는 언어이기 때문입니다. 하지만 저수준 언어는 상황마다 가장 좋은 성능을 낼 수 있는 해결책을 제공해야 하고, 하드웨어 위의 추상화도 더 적어야 한다고 기대됩니다. 그래서 러스트는 여러분의 상황과 요구에 맞게 문제를 모델링할 수 있도록 여러 가지 도구를 제공합니다.

이 장에서는 다음 주제를 다룹니다.

  • 여러 코드 조각을 동시에 실행하기 위해 스레드 만들기
  • 채널로 스레드 사이에 메시지를 보내는 메시지 전달 동시성
  • 여러 스레드가 같은 데이터에 접근하는 공유 상태 동시성
  • 표준 라이브러리 타입뿐 아니라 사용자 정의 타입에도 러스트의 동시성 보장을 확장해 주는 SyncSend 트레이트