Logo ROOT   6.12/07
Reference Guide
mt001_fillHistos.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_multicore
3 /// \notebook
4 /// Fill histograms in parallel and write them on file.
5 /// The simplest meaningful possible example which shows ROOT thread awareness.
6 ///
7 /// \macro_code
8 ///
9 /// \date January 2016
10 /// \author Danilo Piparo
11 
12 // Total amount of numbers
13 const UInt_t nNumbers = 20000000U;
14 
15 // The number of workers
16 const UInt_t nWorkers = 4U;
17 
18 Int_t mt001_fillHistos()
19 {
20 
21  // The first, fundamental operation to be performed in order to make ROOT
22  // thread-aware.
24 
25  // We define our work item
26  auto workItem = [](UInt_t workerID) {
27  // One generator, file and ntuple per worker
28  TRandom3 workerRndm(workerID); // Change the seed
29  TFile f(Form("myFile_%u.root", workerID), "RECREATE");
30  TH1F h(Form("myHisto_%u", workerID), "The Histogram", 64, -4, 4);
31  for (UInt_t i = 0; i < nNumbers; ++i) {
32  h.Fill(workerRndm.Gaus());
33  }
34  h.Write();
35  };
36 
37  // Create the collection which will hold the threads, our "pool"
38  std::vector<std::thread> workers;
39 
40  // Fill the "pool" with workers
41  for (auto workerID : ROOT::TSeqI(nWorkers)) {
42  workers.emplace_back(workItem, workerID);
43  }
44 
45  // Now join them
46  for (auto && worker : workers) worker.join();
47 
48  return 0;
49 }
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
Definition: TObject.cxx:785
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
Definition: TH1.cxx:3244
Random number generator class based on M.
Definition: TRandom3.h:27
TH1 * h
Definition: legend2.C:5
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format...
Definition: TFile.h:46
1-D histogram with a float per channel (see TH1 documentation)}
Definition: TH1.h:567
int Int_t
Definition: RtypesCore.h:41
unsigned int UInt_t
Definition: RtypesCore.h:42
char * Form(const char *fmt,...)
void EnableThreadSafety()
Enables the global mutex to make ROOT thread safe/aware.
Definition: TROOT.cxx:528
A pseudo container class which is a generator of indices.
Definition: TSeq.hxx:66