헛둘이 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)에서 발생하는 비용도 만만치않기 때문에 많다고 좋은것이 절대 아니다.(직원들에게 줄 월급이 없으면 회사 망한다)
 

메모리 관점에서 주의해야 할 점

 

출처 :&amp;nbsp;https://gwanhyeon.github.io/OS-20201116-OS-Process-Thread/

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