exit_code becomeTaskThread( task_mask* mask ) { if( isInitTaskSystem() ) { task_thread_data data; data.queue = global_task_queue; data.mask = mask; return taskThread( ( void* )( &data ) ); } else throw exception( "becomeTaskThread(): Task system not initialized" ); }
void execute(int const numberOfThreads) { auto const n = 1000000000; auto const delta = 1.0 / n; auto const startTime = std::chrono::steady_clock::now(); auto const sliceSize = n / numberOfThreads; std::packaged_task<double()> tasks[numberOfThreads]; for (auto i = 0; i < numberOfThreads; ++i) { tasks[i] = std::packaged_task<double()>(std::bind(partialSum, i, sliceSize, delta)); std::thread taskThread(std::ref(tasks[i])); taskThread.detach(); } auto sum = 0.0; for (auto && task: tasks) { sum += task.get_future().get(); } auto const pi = 4.0 * delta * sum; auto const elapseTime = std::chrono::steady_clock::now() - startTime; out("Futures Thread AW", pi, n, elapseTime, numberOfThreads, std::thread::hardware_concurrency()); }