#include <tbb/tbb.h>
#include <tbb/task.h>
#include <tbb/mutex.h>
#include <tbb/compat/thread>
#include <tbb/compat/condition_variable>
#include <iostream>

#include <cstdio>

using namespace std;
using namespace tbb;

int my_barrier;
mutex my_mutex;
condition_variable my_cond_var;

struct CountTask : public task
{
	virtual task *execute()
	{
		{
			lock_guard<mutex> lock(my_mutex);
			printf("Got into thread %d\n", my_barrier--);
			my_cond_var.notify_one();
		}
		// Causes all available threads to fill up by spinning
		while (true);
		return 0;
	}
};

static void MyFunc(int n)
{
	task_scheduler_init tbbinit( n+1 );
	my_barrier = n;

	for (int i = 0; i < n; ++i) {
		task::enqueue(*new (task::allocate_root()) CountTask);
	}

	{
		unique_lock<mutex> lock(my_mutex);
		while (my_barrier > 0) {
			my_cond_var.wait(lock);
		}
	}
}

int main() {
	int n = task_scheduler_init::default_num_threads();
	printf("n=%d\n",n);

	task_scheduler_init tbbinit( n+1 );

	std::thread thread(MyFunc, n);

	thread.join();

	printf("done\n");

	return 0;
}

