참고 : http://stackoverflow.com/questions/10915233/stdthreadjoin-hangs-if-called-after-main-exits-when-using-vs2012-rc

std::thread 객체를 Windows에서 static으로 사용하는 경우.
join을 호출하면 내부 API가 락을 시도하는데, 프로세스 종료 시점에서 join을 시도하면,

  1. main() 이 반환된다.
  2. 메인스레드가 종료를 위해 프로세스 내부적으로 사용되는 특정한 lock을 건다.
  3. 전역 객체들에 대해 소멸자를 호출하는데 소멸자가 std::thread::join을 호출한다면,
  4. child 스레드가 자신의 종료를 위해 프로세스에 lock을 시도하는데 이미 메인스레드가 lock을 잡고있다.
  5. DEADLOCK.

스택오버플로의 게시물에 의하면 Windows에서만 발생하는 문제인 것 같다.


#include <cstdint>
#include <chrono>
#include <iostream>
#include <atomic>
#include <thread>
#include <vector>

using namespace std;
using namespace std::chrono;
typedef duration<float> fsec;

auto started = steady_clock::now();
atomic<int> counter = 0;

inline int GetNumber()
{
	return ++counter;
}

inline int64_t SigmaN(int64_t n) // to avoid overflow
{
	return n * (n + 1) >> 1;
}

int SerialN(int n)
{
	for (int i = 0; i < n ; ++i)
	{
		if (SigmaN(i) == n)
			return i;
	}

	return 0;
}

int IsPerfectSquare(int n)
{
	if (n < 0)
		return 0;

	int root = (int)(sqrt(n));

	return n == root * root ?
					root : 0;
}

void Work()
{
	while (true)
	{
		int number = GetNumber();

		if (0 > number)
			break; // until overflow

		int root = IsPerfectSquare(number);

		if (0 < root)
		{
			auto last_of_serial = SerialN(number);

			if (0 < last_of_serial)
			{
				//print elapsed time
				printf("%d = %d^2 = sum(1..%d)n %0.2f secn",
					number, root, last_of_serial,
					duration_cast<fsec>(steady_clock::now() - started).count()
					);
			}
		}
	}//while
}



int main (void)
{
	const size_t sizeofThread = 9;

	vector<thread> workers;

	for (int i = 0; i < sizeofThread; ++i)
	{
		workers.push_back(thread(Work));
	}

	for (auto& t : workers)
		t.join();
}

굳이 멀티스레드로 돌려본건 cpu 100% 찍어본지가 오래됬기땜에..