Logo ROOT  
Reference Guide
mt103_fillNtupleFromMultipleThreads.C File Reference

Detailed Description

View in nbviewer Open in SWAN
Fill the same TNtuple from different threads.

This tutorial illustrates the basics of how it's possible with ROOT to write simultaneously to a single output file using TBufferMerger.

void mt103_fillNtupleFromMultipleThreads()
{
// Avoid unnecessary output
gROOT->SetBatch();
// Make ROOT thread-safe
// Total number of events
const size_t nEntries = 65535;
// Match number of threads to what the hardware can do
const size_t nWorkers = 4;
// Split work in equal parts
const size_t nEventsPerWorker = nEntries / nWorkers;
// Create the TBufferMerger: this class orchestrates the parallel writing
auto fileName = "mt103_fillNtupleFromMultipleThreads.root";
ROOT::TBufferMerger merger(fileName);
// Define what each worker will do
// We obtain from a merger a TBufferMergerFile, which is nothing more than
// a file which is held in memory and that flushes to the TBufferMerger its
// content.
auto work_function = [&](int seed) {
auto f = merger.GetFile();
TNtuple ntrand("ntrand", "Random Numbers", "r");
TRandom rnd(seed);
for (auto i : ROOT::TSeqI(nEntries))
ntrand.Fill(rnd.Gaus());
f->Write();
};
// Create worker threads
std::vector<std::thread> workers;
for (auto i : ROOT::TSeqI(nWorkers))
workers.emplace_back(work_function, i + 1); // seed==0 means random seed :)
// Make sure workers are done
for (auto &&worker : workers)
worker.join();
}
#define f(i)
Definition: RSha256.hxx:104
#define gROOT
Definition: TROOT.h:404
TBufferMerger is a class to facilitate writing data in parallel from multiple threads,...
A pseudo container class which is a generator of indices.
Definition: TSeq.hxx:67
A simple TTree restricted to a list of float variables only.
Definition: TNtuple.h:28
This is the base class for the ROOT Random number generators.
Definition: TRandom.h:27
void EnableThreadSafety()
Enables the global mutex to make ROOT thread safe/aware.
Definition: TROOT.cxx:493
Date
May 2017
Author
Guilherme Amadio

Definition in file mt103_fillNtupleFromMultipleThreads.C.