forked from CppKorea/CppConcurrencyInAction
-
Notifications
You must be signed in to change notification settings - Fork 0
Chapter 01, Hello, world of concurrency in Cpp!
Chris Ohk edited this page Nov 13, 2015
·
27 revisions
- 동시성(Concurrency)이란 2가지 이상의 서로 다른 일들이 동시에 발생하는 것
- 걸으면서 대화하는 행동
- 한 손으로 손잡이를 잡으면서 다른 한 손으로 스마트폰을 보는 행동
- 컴퓨터에서 동시성이란 한 시스템이 서로 다른 작업들을 동시에 수행하는 것을 의미 (연속적으로, 또는 한 작업이 끝나고 다음 작업을 처리하는 것과는 의미가 다름)
- 예전에 사용하던 컴퓨터는 프로세서가 1개이기 때문에 한 번에 한 가지 작업만 수행 가능하지만 다른 작업으로 전환 가능
- 작업 전환 (Task Switching) : 다른 작업으로 전환하는데 걸리는 시간이 너무 빨라 동시에 하는 것처럼 보임
- 하드웨어 동시성 (Hardware Concurrency) : 프로세서가 여러 개이거나 하나의 프로세서 안에 여러 개의 코어가 있는 경우 하나 이상의 작업을 "진짜로" 동시에 수행할 수 있음
- 문맥 교환 (Context Switch) : 어떤 작업에서 다른 작업으로 전환할 때 수행 (비용이 발생)
- 동시성 프로그래밍을 할 때 가장 중요하게 고려해야 할 요소는 실제 하드웨어 스레드(Hardware Thread)의 개수!
- C++11의 특징 중 하나는 멀티스레딩을 통한 동시성의 표준 지원
- 플랫폼마다 코드를 따로 작성하지 않아도 됨
- C++98 표준을 제정할 당시에는...
- 스레드의 존재를 알지 못했었음
- 함수의 동작은 연속적으로 처리하는 머신을 기준으로 작성됨
- 표준 메모리 모델이 정의되지 않았었음
→ 컴파일러의 확장 기능 없이는 멀티스레딩 애플리케이션을 만들 수 없었음
- 컴파일러 벤더들은 멀티스레딩을 위한 확장 기능을 추가
- POSIX C Standard
- Microsoft Windows API
- MFC
- C++ Runtime Library
- Boost
- ACE
- C++ 스레드 라이브러리를 통해 멀티스레딩과 동시성과 관련된 많은 기능들을 제공해주지만, 때로는 특정 플랫폼에만 있는 기능을 사용하고 싶을 때가 있음
- C++ 스레드 라이브러리를 사용했을 때의 장점을 그대로 유지하면서 이런 기능을 사용하고 싶다면,
native_handle()
함수를 사용하면 됨
- C++11을 지원하는 컴파일러 필요
#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() 함수가 대기하도록 만듬
- 동시성과 멀티스레딩의 정의, 애플리케이션에서 동시성을 사용하는 / 사용하지 않는 이유를 설명함
- C++98에서는 동시성과 관련된 기능을 제공하지 않아 플랫폼마다 다양한 확장 라이브러리가 존재했었음
- C++11로 오면서 동시성과 관련된 기능을 표준으로 제공함
- 플랫폼에 상관 없이 동일한 코드로 동시성을 지원, 최신 CPU 지원