분류 전체보기 26

C++ thread local storage: 경쟁 없는 리소스 관리

C++은 11 버전부터 Thread Local Storage를 지원하기 시작했습니다. 그 이전에는 Windows NT (__declspec(thread)) - 1994, POSIX threads (pthread_key_*) - 1995, GCC (__thread) - 2002에서 지원하기 시작했습니다. 이 오래된 Thread Local Storage(이하 TLS)는 그만큼 매우 유용한 기능이라 볼 수 있습니다. errno도 대표적인 TLS변수입니다. TLS의 장점은 각 개별 쓰레드가 필요한 리소스 경쟁을 피하면서도 성능과 사용성에 유리하게 적용할 수 있다는 점입니다. 같이보면 좋은 글C++ 멀티쓰레드: Read-Only 데이터셋의 업데이트와 락프리 접근C++ std::mutex보다 빠른 RCU(Lock..

카테고리 없음 2025.01.20

고인물은 싫어하는 C++ 템플릿 활용: concat_with_delimiter

한국에서 푸대접받는 C++ 템플릿맞습니다. 고인물들은 템플릿을 지독히 싫어합니다. 가끔 휴식시간에 이야기를 나누어 보면 "템플릿 오류메시지가 너무 복잡하다, 코드 따라가기 힘들다. 무슨 외계어냐"라는 비아냥을 들을 때가 있습니다. 템플릿을 선호하는 시니어급 개발자는 보기 드문 편입니다. 오히려 경력이 짧은 개발자들이 더 쉽고 편하게 받아들이기도 합니다. by NotebookLM 템플릿을 이용한 구현과 문자열세기의 TRADE-OFF 저도 오래된 개발자이다 보니 C부터 시작했습니다. C로 할 때는 디버깅에 많은 시간을 보내야만 했습니다. 배열 인덱스를 잘못 가리키는 문제를 찾는다던가, 도대체 어디서 해제했길래 뻑이 나는지, 개발하러 왔는데 문자열은 왜 세고 있는지. 템플릿은 해석하기도 만들기도 다소 난해..

카테고리 없음 2024.12.22

std::thread의 실전적 랩핑 - thread 클래스 구현

std::thread의 실전적 랩핑 - thread 클래스 구현std::condition_variable의 안전한 시그널링들어가며C++11에서 std::thread가 도입된 이후, 많은 개발자들이 멀티쓰레딩 프로그래밍을 더 쉽게 할 수 있게 되었습니다. 하지만 실제 프로덕션 환경에서는 std::thread를 직접 사용하는 것보다는 적절히 랩핑 하여 사용하는 것이 더 안전하고 유지보수하기 좋습니다. 이 글에서는 실전에서 사용할 수 있는 쓰레드 래퍼 클래스를 처음부터 구현해 보면서, 각 단계에서의 설계 결정과 그 이유를 살펴보겠습니다. by NotebookLM std::thread 사용 시의 실제 문제점들실제 프로젝트에서 std::thread를 직접 사용하면서 마주치는 주요 문제들이 있습니다: 쓰레드 시작/..

카테고리 없음 2024.12.20

std::condition_variable의 안전한 시그널링

std::condition_variable의 안전한 시그널링std::thread의 실전적 랩핑 - thread 클래스 구현 C++17로 진화하기: std::condition_variable 안전한 랩핑 C++17로 진화하기: std::condition_variable의 안전한 랩핑이전에 아래 내용을 C++11로 랩핑 하였는데요, std::condition_variable의 안전한 시그널링앞서 소개한 위 코드를 C++17로 다시 랩핑 하려 합니다. 특히 std::condition_variable에서의 C++11의 복잡했던 템플릿식cplusplus.tistory.com [[아래 글은 C++11 기준]] 쓰레드 간 동기화와 시그널링은 멀티쓰레드 프로그래밍에서 가장 기본적이면서도 까다로운 문제 중 하나입니다..

카테고리 없음 2024.12.20

C 개발자는 모르는 자동 자원 해제 C++ RAII

RAII(Resource Acquisition Is Initialization)는 현대 언어에 와서는 없어서는 안 될 필수 개념으로 자리 잡았습니다. 그리고 현대 언어들에게 많은 영향을 끼쳤습니다. 하지만 이를 적극 활용하여 개발하는 C++개발자는 게임 이외의 산업에서는 드문 편입니다. 한국은 젊은 C++개발자들이 없어서 일까요? 아니면 C개발자들이 마지못해 JAVA나 C++시장으로 밀려들어와서 일까요. C99 부터는 C++과 호환되지 않습니다. C는 C23표준에 와서야 자동해제를 지원하기 시작했습니다.) C개발자들이 C++ 생태계에 참여하는 것은 매우 환영할 만한 일입니다. 하지만 이 과정에서 C++의 현대적 특성이 이해되지 않고, 단순히 'C의 확장' 정도로 취급되는 현실은 비판적으로 바라볼 필요가 ..

카테고리 없음 2024.12.16

C++ Lockfree Queue 항상 좋은 선택일까?

동시성 프로그래밍에서 락-프리(queue) 데이터 구조는 매력적으로 보일 수 있습니다. 블로킹이 없는 비블로킹 설계 덕분에 높은 성능과 낮은 지연 시간을 기대할 수 있기 때문입니다. 그러나 락-프리 큐가 항상 최선일지는 정말 고려할 점이 생각보다 많습니다.장점 - 블로킹 없는 높은 성능, 지연시간 감소, 교착상태 없음단점 - 구현시 복잡도(CAS경합, 메모리 관리, ABA문제), 대기 시 CPU소모량, 제약조건들 또는 외부 라이브러리 의존성.락프리 알고리즘을 구현하려면 하드웨어부터 운영체제, 컴파일러, 그리고 애플리케이션 레벨까지 모든 계층에서 세심한 주의가 필요합니다. C++ Core Guidelines에서는 락프리 프로그래밍을 정말 필요치 않으면 사용하지 말라고 권고하고 있으며 이런 구현상의 난이도 ..

카테고리 없음 2024.12.15