19.3 std::thread와 멀티쓰레딩의 기초
#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