histogram/examples/guide_parallel_filling.cpp
2019-05-15 21:54:27 +02:00

51 lines
1.4 KiB
C++

// Copyright 2018-2019 Hans Dembinski
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)
//[ guide_parallel_filling
#include <boost/histogram.hpp>
#include <boost/histogram/algorithm/sum.hpp>
#include <cassert>
#include <functional>
#include <thread>
#include <vector>
// dummy fill function, to be executed in parallel by several threads
template <typename Histogram>
void fill(Histogram& h) {
for (unsigned i = 0; i < 1000; ++i) { h(i % 10); }
}
int main() {
using namespace boost::histogram;
/*
Create histogram with container of thread-safe counters for parallel filling in
several threads. Only filling is thread-safe, other guarantees are not given.
*/
auto h = make_histogram_with(dense_storage<accumulators::thread_safe<unsigned>>(),
axis::integer<>(0, 10));
/*
Run the fill function in parallel from different threads. This is safe when a
thread-safe accumulator and a storage with thread-safe cell access are used.
*/
auto fill_h = [&h]() { fill(h); };
std::thread t1(fill_h);
std::thread t2(fill_h);
std::thread t3(fill_h);
std::thread t4(fill_h);
t1.join();
t2.join();
t3.join();
t4.join();
// Without a thread-safe accumulator, this number may be smaller.
assert(algorithm::sum(h) == 4000);
}
//]