/* Check cf5-opt.vim defs.
VIM: let g:lcppflags="-std=c++11 -O2 -pthread"
VIM: let g:cppflags=g:Iboost.g:Itbb
VIM: let g:ldflags=g:Lboost.g:Ltbb.g:tbbmalloc
VIM: let g:ldlibpath=g:Bboost.g:Btbb
*/
#include <tbb/enumerable_thread_specific.h>
#include <tbb/task_scheduler_init.h>
#include <tbb/parallel_for_each.h>
#include <iostream>
#include <exception>
#include <vector>

/*
 * 	Conclusion:
 * 		The first task_sheduler_init is configuring number of threads in
 * 		the thread pool. If the task scheduler initialised implicitly then
 * 		the number of threads is the number of cores. To ensure uncomment
 * 		the commented line below.
 */

int main ( void )
{try{

	std::vector<int> v(1024*1024);
	//tbb::enumerable_thread_specific<int> count;
	tbb::task_scheduler_init init3(5);
	tbb::task_scheduler_init init(10);
	tbb::task_scheduler_init init2(1);
	tbb::enumerable_thread_specific<int> count;
	tbb::parallel_for_each( v.begin(), v.end(), [&count](int& v){
		++count.local();
	});

	int i = 0;
	for ( int c : count )
	{
		std::cout << "Thread: " << ++i << " counted " << c << std::endl;
	}
	return 0;
}
catch ( const std::exception& e )
{
	std::cerr << std::endl
			<< "std::exception(\"" << e.what() << "\")." << std::endl;
	return 2;
}
catch ( ... )
{
	std::cerr  << std::endl
			<< "unknown exception." << std::endl;
	return 1;
}}

