#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <vector>
#include <mutex>

using namespace std;

int main()
{
	const int num_pro = std::thread::hardware_concurrency();
	
	// cout << std::thread::hardware_concurrency() << "\n"; // 4

	cout << std::this_thread::get_id() << "\n"; // 현재 thread id

	vector<std::thread> my_threads;
	my_threads.resize(num_pro);

	for (auto & e : my_threads)
		e = std::thread([](){
			cout << std::this_thread::get_id() << "\n"; // 현재 thread id
			while (true) {}});

	

	// t1.join(); // 다시 합쳐진다. t1이 끝날때까지 기다린다.
	// t2.join();
	// t3.join();

	for (auto & e : my_threads)
		e.join();
	

	return 0;
}

#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <vector>
#include <mutex>

using namespace std;

int main()
{
	auto work_func = [](const string & name)
	{
		for (int i=0;i<5;++i)
		{
			std::this_thread::sleep_for(std::chrono::milliseconds(100));
			cout << name << " " << std::this_thread::get_id() << " is working " << i << "\n";
		}
	};

	work_func("JackJack");
	work_func("Dash"); // 잭잭이 일하는동안 대시는 놀고있다.
	
	return 0;
}

결과

JackJack 139961711490880 is working 0
JackJack 139961711490880 is working 1
JackJack 139961711490880 is working 2
JackJack 139961711490880 is working 3
JackJack 139961711490880 is working 4
Dash 139961711490880 is working 0
Dash 139961711490880 is working 1
Dash 139961711490880 is working 2
Dash 139961711490880 is working 3
Dash 139961711490880 is working 4

thread

#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <vector>
#include <mutex>

using namespace std;

int main()
{
	auto work_func = [](const string & name)
	{
		for (int i=0;i<5;++i)
		{
			std::this_thread::sleep_for(std::chrono::milliseconds(100));
			cout << name << " " << std::this_thread::get_id() << " is working " << i << "\n";
		}
	};

	std::thread t1 = std::thread(work_func, "JackJack");
	std::thread t2 = std::thread(work_func, "Dash");

	t1.join();
	t2.join();
	

	return 0;
}

결과

Dash 140053583628032 is working 0
JackJack 140053592020736 is working 0
Dash 140053583628032 is working JackJack 1
140053592020736 is working 1
Dash 140053583628032 is working 2
JackJack 140053592020736 is working 2
Dash 140053583628032 is working 3
JackJack 140053592020736 is working 3
Dash 140053583628032 is working 4
JackJack 140053592020736 is working 4

출력할때만 서로 간섭하지 못하게 하고 싶다.

#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <vector>
#include <mutex>

using namespace std;

mutex mtx; // mutual exclusion. 상호 배제. 서로 못 건드리게 한다.


int main()
{
	auto work_func = [](const string & name)
	{
		for (int i=0;i<5;++i)
		{
			std::this_thread::sleep_for(std::chrono::milliseconds(100));


			mtx.lock(); // 다른 thread가 못들어옴.
			cout << name << " " << std::this_thread::get_id() << " is working " << i << "\n";
			mtx.unlock(); // 반드시 풀어줘야 한다. // 다른 thread가 들어와서 잠그고 다시 출력하고 반복
			// unlock()을 안해주면 오류가 난다. thread가 잠궈버리고 끝났으므로 오류가 생김.
		}
	};

	std::thread t1 = std::thread(work_func, "JackJack");
	std::thread t2 = std::thread(work_func, "Dash");

	t1.join();
	t2.join();
	

	return 0;
}

결과

JackJack 139781373867776 is working 0
Dash 139781365475072 is working 0
JackJack 139781373867776 is working 1
Dash 139781365475072 is working 1
JackJack 139781373867776 is working 2
Dash 139781365475072 is working 2
JackJack 139781373867776 is working 3
Dash 139781365475072 is working 3
JackJack 139781373867776 is working 4
Dash 139781365475072 is working 4