Program Language/C & C++

[C++] std::thread 종료 (abort() has been called)

야곰야곰+책벌레 2021. 10. 26. 18:19
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