게임 서버/[Inflearn_rookiss]올인원_클라&서버 연동
2. 멀티 쓰레드 실습
헛둘이
2023. 12. 11. 09:39
#include <iostream>
#include <thread>
#include <vector>
using namespace std;
void HelloThread(int i)
{
cout << "Hello thread" << i << endl;
}
int main()
{
//ios_base::sync_with_stdio(false);
//cin.tie(NULL);
//cout.tie(NULL);
vector<thread> vThreads = {};
for (int i = 0; i < 10; ++i)
{
vThreads.push_back(thread(HelloThread, i));
}
auto concurrency = vThreads[0].hardware_concurrency();
for (auto& thr : vThreads)
{
thr.join();
}
return 0;
}
- concurrency는 현재 하드웨어에서 사용할 수 있는 코어 수를 가져온다.
- 이 얘기는 실질적으로 이 코어 수보다 더 많은 스레드를 만들어도 동시에 실행되는게 아니라 동시에 실행되는 것처럼 보이는 것이다
- 따라서 가장 최적의 상황은 이 코어만큼만 쓰레드를 만드는 것
- 왜냐하면 직원에 영혼을 주입하는 과정(Context Switching)에서 발생하는 비용도 만만치않기 때문에 많다고 좋은것이 절대 아니다.(직원들에게 줄 월급이 없으면 회사 망한다)
메모리 관점에서 주의해야 할 점

- 스레드는 프로세스 내에서 Stack을 제외한 나머지 영역들을 공유한다
- 여러 스레드들은 힙 공간을 공유하지만 반면에 프로세스들은 일반적으로 다른 프로세스의 메모리에 접근할 수 없다. (물론 Windows API의 디버그 함수를 통해 방법을 만들 수는 있다 WriteProcessMemory, ReadProcessMemory ...등등)
- 그러나 힙 영역과 데이터 영역을 공유하므로 이 영역에 있는 변수들을 동시에 접근할 수 있어서 조심하게 신중하게 사용해야 한다.