728x90
반응형
std::thread를 사용하다 보면 abort() has been called라는 에러 메시지를 만나는 경우가 있다.
이는 thread가 종료되기 전에 시스템이 종료되거나, 객체가 사라질 때 발생한다.
이 때는 join()을 사용해서 해결하면 된다.
#include <thread>
#include <iostream>
using namespace std;
int total;
void sum()
{
for (int i = 0; i < 200000; i++)
total += 1;
}
int main()
{
while (1)
{
total = 0;
std::thread th1(sum);
std::thread th2(sum);
cout << "total : " << total << endl;
}
return 0;
}
위의 코드는 상기의 abort()... 에러가 발생하도록 만든 예제이다.
예제는 thread 간 데이터 침범을 막을 수 있게 설정하지 않았기 때문에 엉망이다. ( 이를 보려고 하는 건 아니니까)
join() 함수는 thread가 시작되고 나서 작업이 끝나면 thread를 정지하고, thread가 종료하면 return 한다.
#include <thread>
#include <iostream>
using namespace std;
int total;
void sum()
{
for (int i = 0; i < 200000; i++)
total += 1;
}
int main()
{
while (1)
{
total = 0;
std::thread th1(sum);
std::thread th2(sum);
th1.join(); // join 삽입
th2.join(); // join 삽입
cout << "total : " << total << endl;
}
return 0;
}
RAII로 표현하면 아래와 같이 할 수 있다.
class CThreadJoiner
{
public:
explicit CThreadJoiner(std::thread& thread) : m_thread(thread) {}
~CThreadJoiner()
{
if (m_thread.joinable())
m_thread.join();
}
private:
std::thread& m_thread;
};
thread가 소멸할 때 자동적으로 join() 해 주게 된다.
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[C++] file in/out (0) | 2021.11.08 |
---|---|
[C++] RAII Pattern (2) | 2021.10.26 |
[C++] 스마트 포인터 (0) | 2021.10.25 |
[C++] emplace_back (0) | 2021.10.25 |
[C++] 윈도우즈에서 텍스트로 함수 호출 (2) | 2021.10.22 |