프로세스
멀티 쓰레드(multithread) 프로그램 : 여러개의 쓰레드로 구성된 프로그램
프로세스들은 서로 메모리를 공유하지 않음.
같은 프로세스 내 쓰레드끼리는 메모리를 공유함.

프로그램 논리 구조 상에서,
연산들 간의 의존 관계가 많을 수 록 병렬화가 어려워지고,
반대로 다른 연산의 결과와 관계없이 독립적으로 수행할 수 있는 구조가 많을 수 록 병렬화가 매우 쉬워짐!
웹사이트를 다운받는 것과 같이 대기시간이 긴 작업을 수행할 때, 여러 개의 쓰레드를 사용하면 더 효율적으로 작업할 수 있음.


c++ 11부터 표준에 thread가 추가됨.
// 내 생에 첫 쓰레드
#include <iostream>
#include <thread>
using std::thread;
void func1() {
for (int i = 0; i < 10; i++) {
std::cout << "쓰레드 1 작동중! \n";
}
}
void func2() {
for (int i = 0; i < 10; i++) {
std::cout << "쓰레드 2 작동중! \n";
}
}
void func3() {
for (int i = 0; i < 10; i++) {
std::cout << "쓰레드 3 작동중! \n";
}
}
int main() {
thread t1(func1);
thread t2(func2);
thread t3(func3);
t1.join();
t2.join();
t3.join();
}
--> 운영체제가 쓰레드들을 어떤 코어에 할당하고, 또 어떤 순서로 스케쥴 할지는 그 때 그 때 마다 상황에 맞게 바뀌기 때문에 결과 예측이 불가하며, 매번 결과가 달라짐.
t1.join();
t2.join();
t3.join();
or
t1.detach();
t2.detach();
t3.detach();
join 함수
detach 함수
join 되거나 detach 되지 않는 쓰레드들의 소멸자가 호출된다면 예외를 발생시키도록 명시되어 있음.
쓰레드는 리턴값 이란것이 없기 때문에 만일 어떠한 결과를 반환하고 싶다면 포인터의 형태로 전달하면 됨.
쓰레드를 생성할 때 함수에 인자들을 전달하는 방법은 이전에 std::bind 를 사용했던 방법과 유사
thread(worker, data.begin() + i * 2500, data.begin() + (i + 1) * 2500,
&partial_sums[i])
thread 생성자의 첫번째 인자로 함수를 전달하고, 이어서 해당 함수에 전달할 인자를 나열