Skip to content

Chapter 01, Hello, world of concurrency in Cpp!

Chris Ohk edited this page Nov 13, 2015 · 27 revisions

Chapter 01, Hello, world of concurrency in C++!

1.1 동시성이란 무엇인가?

  • 동시성(Concurrency)이란 2가지 이상의 서로 다른 일들이 동시에 발생하는 것
    • 걸으면서 대화하는 행동
    • 한 손으로 손잡이를 잡으면서 다른 한 손으로 스마트폰을 보는 행동

1.1.1 컴퓨터 시스템에서의 동시성

  • 컴퓨터에서 동시성이란 한 시스템이 서로 다른 작업들을 동시에 수행하는 것을 의미 (연속적으로, 또는 한 작업이 끝나고 다음 작업을 처리하는 것과는 의미가 다름)
  • 예전에 사용하던 컴퓨터는 프로세서가 1개이기 때문에 한 번에 한 가지 작업만 수행 가능하지만 다른 작업으로 전환 가능
  • 작업 전환 (Task Switching) : 다른 작업으로 전환하는데 걸리는 시간이 너무 빨라 동시에 하는 것처럼 보임
  • 하드웨어 동시성 (Hardware Concurrency) : 프로세서가 여러 개이거나 하나의 프로세서 안에 여러 개의 코어가 있는 경우 하나 이상의 작업을 "진짜로" 동시에 수행할 수 있음
  • 문맥 교환 (Context Switch) : 어떤 작업에서 다른 작업으로 전환할 때 수행 (비용이 발생)
  • 동시성 프로그래밍을 할 때 가장 중요하게 고려해야 할 요소는 실제 하드웨어 스레드(Hardware Thread)의 개수!

1.1.2 동시성으로의 접근

다중 프로세서의 동시성

다중 스레드의 동시성

1.2 왜 동시성인가?

1.2.1

1.2.2

1.2.3

1.3 C++의 동시성과 멀티스레딩

  • C++11의 특징 중 하나는 멀티스레딩을 통한 동시성의 표준 지원
    • 플랫폼마다 코드를 따로 작성하지 않아도 됨

1.3.1 C++ 멀티스레딩의 역사

  • C++98 표준을 제정할 당시에는...
    • 스레드의 존재를 알지 못했었음
    • 함수의 동작은 연속적으로 처리하는 머신을 기준으로 작성됨
    • 표준 메모리 모델이 정의되지 않았었음

→ 컴파일러의 확장 기능 없이는 멀티스레딩 애플리케이션을 만들 수 없었음

  • 컴파일러 벤더들은 멀티스레딩을 위한 확장 기능을 추가
    • POSIX C Standard
    • Microsoft Windows API
    • MFC
    • C++ Runtime Library
      • Boost
      • ACE

1.3.2 새 표준에서의 동시성 지원

1.3.3 C++ 스레드 라이브러리의 효율성

1.3.4 플랫폼별 기능

  • C++ 스레드 라이브러리를 통해 멀티스레딩과 동시성과 관련된 많은 기능들을 제공해주지만, 때로는 특정 플랫폼에만 있는 기능을 사용하고 싶을 때가 있음
  • C++ 스레드 라이브러리를 사용했을 때의 장점을 그대로 유지하면서 이런 기능을 사용하고 싶다면, native_handle() 함수를 사용하면 됨

1.4 시작하기

  • C++11을 지원하는 컴파일러 필요

1.4.1 Hello, Concurrent World

    #include <iostream>
    #include <thread>

    void Hello()
    {
        std::cout << "Hello, Concurrent World!\n";
    }

    int main()
    {
        std::thread t(Hello);
        t.join();
    }
  • #include <thread> : 멀티스레딩 관련 클래스 및 함수를 사용하기 위해 추가해야 하는 헤더 파일
  • void Hello() { ... } : 스레드가 실행할 함수 (모든 스레드는 초기 함수(Initial Function)을 가짐)
  • std::thread t(Hello); : 새로운 스레드 선언, 인자로 초기 함수 Hello()를 전달, 선언 뒤 스레드 실행
  • t.join(); : 프로그램이 종료된 후에 Hello() 함수가 수행될 가능성이 존재, 따라서 join()을 통해 스레드의 실행이 끝날 때까지 main() 함수가 대기하도록 만듬

1.5 정리

  • 동시성과 멀티스레딩의 정의, 애플리케이션에서 동시성을 사용하는 / 사용하지 않는 이유를 설명함
  • C++98에서는 동시성과 관련된 기능을 제공하지 않아 플랫폼마다 다양한 확장 라이브러리가 존재했었음
  • C++11로 오면서 동시성과 관련된 기능을 표준으로 제공함
    • 플랫폼에 상관 없이 동일한 코드로 동시성을 지원, 최신 CPU 지원