NeuroWhAI의 잡블로그

[Rust] Send와 Sync 본문

개발 및 공부/언어

[Rust] Send와 Sync

NeuroWhAI 2018. 11. 12. 20:58


티스토리 조회수 서버가 잘 동작하는지 보고 싶어서 로그를 봤는데

에러가 있었습니다. (그 와중에 robots.txt 접근이 있는 걸 보니 크롤러가 벌써...)
정확히 어디서 발생한 에러인지 모른다는게 흠이지만 (자체 로그의 중요성)
짐작가는 곳이 있어서 거길 고쳤습니다.

문제가 됬던 부분은 API 요청에 쓰는 객체가 여러 스레드에서 사용되면 안됬었고
이미 Rust가 컴파일 오류를 통해 그 사실을 알려줬었는데
제가 강제로 Send, Sync trait을 구현해서 컴파일이 되게 만들었던 것이었죠. (멍청)
이 바보 같은 짓은 깃헙 레포의 커밋 내역을 보시면 바로 알 수 있습니다...

그런데 참 신기한 우연이 있었습니다.
시간이 날 때마다 Rust 튜토리얼을 반복해서 보는데 마침 오늘 볼 파트가 Sync, Send였던 것이죠.
와우...

이쯤 되면 Rust를 모르시는 분들은 그래서 Send, Sync가 뭐냐 하실텐데
간단합니다.
각 trait이 구현(impl)되어 있다는 것은 아래의 의미와 같습니다.
Send : 이 객체는 스레드 사이를 이동할 수 있다.
Sync : 이 객체는 여러 스레드에서 사용될 수 있다.
여기서 이동한다는 것은 C++의 이동 시맨틱처럼 소유권을 이전하는 것을 말합니다.
여러 스레드에서 사용될 수 있다는 것은 그 객체의 참조를 다른 스레드로 넘길 수 있다는 것이죠.
(참고로 구현을 한다는게 진짜 어떤 코드를 작성하는게 아니라 대부분은 자동으로 지정이 됩니다.)

참고로 제가 강제로 Send, Sync를 구현했던 녀석은 원래 Send는 이미 되어있었고 !Sync가 걸려있었습니다.
!Sync는 뭐 'not' Sync 정도의 의미로서 반대의 의미를 가진다고 보면 됩니다.
이걸 제가 무시해버렸으니 당연히 문제가 생긴 것이겠죠... ㅠ
Rust가 스레드 안전성 보장을 목표의 일부로 하는 언어라는걸 이렇게 느끼게 되었네요.




Comments