55 const std::shared_ptr<GOptions>& gopt,
56 const std::shared_ptr<GLogger>& log) -> std::vector<std::shared_ptr<GEventDataCollection>> {
57 std::mutex collectorMtx;
58 std::vector<std::shared_ptr<GEventDataCollection>> collected;
63 std::atomic<int> next{1};
69 std::vector<jthread_alias> pool;
71 pool.reserve(nthreads);
73 for (
int tid = 0; tid < nthreads; ++tid) {
75 pool.emplace_back([&, tid]
78 log->info(0,
"worker ", tid,
" started");
81 thread_local std::vector<std::shared_ptr<GEventDataCollection>> localRunData;
87 int evn = next.fetch_add(1, std::memory_order_relaxed);
88 if (evn > nevents)
break;
91 localRunData.emplace_back(event_data_collection);
98 std::scoped_lock lk(collectorMtx);
99 for (
auto& evt : localRunData) { collected.emplace_back(evt); }
100 localRunData.clear();
103 log->info(0,
"worker ", tid,
" processed ", localCount,
" events");
112int main(
int argc,
char* argv[]) {
119 constexpr int nevents = 10;
120 constexpr int nthreads = 8;
125 for (
size_t i = 0; i < runData.size(); i++) { log->info(
"event n. ", i + 1,
" collected with local event number: ", runData[i]->getEventNumber()); }