Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4Threading.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// G4Threading implementation
27//
28// Author: Andrea Dotti, 15 February 2013 - First Implementation
29// Revision: Jonathan R. Madsen, 21 February 2018
30// --------------------------------------------------------------------
31
32#include "G4Threading.hh"
33#include "G4AutoDelete.hh"
34#include "G4AutoLock.hh"
35#include "globals.hh"
36
37#if defined(WIN32) || defined(__MINGW32__)
38# include <Windows.h>
39#else
40# include <sys/syscall.h>
41# include <sys/types.h>
42# include <unistd.h>
43#endif
44
45#if defined(G4MULTITHREADED)
46
47# include <atomic>
48
49namespace
50{
52 G4bool isMTAppType = false;
53} // namespace
54
56{
57 // In multithreaded mode return Thread ID
58 return std::this_thread::get_id();
59}
60
62{
63 return std::thread::hardware_concurrency();
64}
65
66void G4Threading::G4SetThreadId(G4int value) { G4ThreadID = value; }
67G4int G4Threading::G4GetThreadId() { return G4ThreadID; }
68G4bool G4Threading::IsWorkerThread() { return (G4ThreadID >= 0); }
69G4bool G4Threading::IsMasterThread() { return (G4ThreadID == MASTER_ID); }
70
71# if defined(__linux__) || defined(_AIX)
73{
74 cpu_set_t* aset = new cpu_set_t;
76 CPU_ZERO(aset);
77 CPU_SET(cpu, aset);
78 pthread_t& _aT = (pthread_t&) (aT);
79 return (pthread_setaffinity_np(_aT, sizeof(cpu_set_t), aset) == 0);
80}
81# else // Not available for Mac, WIN,...
83{
84 G4Exception("G4Threading::G4SetPinAffinity()", "NotImplemented", JustWarning,
85 "Affinity setting not available for this architecture, "
86 "ignoring...");
87 return true;
88}
89# endif
90
92{
93 isMTAppType = value;
94}
95
96G4bool G4Threading::IsMultithreadedApplication() { return isMTAppType; }
97
98namespace
99{
100 std::atomic_int numActThreads(0);
101}
102G4int G4Threading::WorkerThreadLeavesPool() { return --numActThreads; }
103G4int G4Threading::WorkerThreadJoinsPool() { return ++numActThreads; }
105{
106 return numActThreads.load();
107}
108
109#else // Sequential mode
110
112{
113 // In sequential mode return Process ID and not Thread ID
114# if defined(WIN32)
115 return GetCurrentProcessId();
116# else
117 return getpid();
118# endif
119}
120
126
128
134
135#endif
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
G4int G4Pid_t
Definition: G4Threading.hh:263
G4DummyThread::native_handle_type G4NativeThread
Definition: G4Threading.hh:248
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
void Register(T *inst)
Definition: G4AutoDelete.hh:65
G4int WorkerThreadJoinsPool()
Definition: G4Threading.cc:132
G4bool G4SetPinAffinity(G4int idx, G4NativeThread &at)
Definition: G4Threading.cc:127
G4int G4GetNumberOfCores()
Definition: G4Threading.cc:121
G4int WorkerThreadLeavesPool()
Definition: G4Threading.cc:131
G4bool IsWorkerThread()
Definition: G4Threading.cc:123
G4bool IsMultithreadedApplication()
Definition: G4Threading.cc:130
G4Pid_t G4GetPidId()
Definition: G4Threading.cc:111
G4bool IsMasterThread()
Definition: G4Threading.cc:124
G4int G4GetThreadId()
Definition: G4Threading.cc:122
void SetMultithreadedApplication(G4bool value)
Definition: G4Threading.cc:129
G4int GetNumberOfRunningWorkerThreads()
Definition: G4Threading.cc:133
void G4SetThreadId(G4int aNewValue)
Definition: G4Threading.cc:125
#define G4ThreadLocal
Definition: tls.hh:77