새롭게 추가해볼 Action Initialization 클래스를 소개한다. Action Initialization 클래스는 G4VUserActionInitialization 클래스를 상속한다. 유저는 마스터 스레드에 생성할 Action 클래스를 정하는 BuildForMaster(), 하위 스레드에 생성할 Action 클래스를 정하는 Build() 함수를 만들어주면 된다.
Multi-threading은 이전 까지와는 다르게 스레드 별로 Action 클래스를 생성한다. 따라서 메인 매크로 example.cc의 Action 클래스들을 Action Initialization 클래스로 옮기고 Action Initialization 클래스를 메인 매크로에서 초기화 한다.
메인 매크로 바꾸기
먼저 클래스 이름을 OTActionInitialization 을 정하고 메인 매크로에서 SetUserAction() 함수를 모두 지운 후 다음과 같이 적자.
runManager -> SetUserInitialization(new OTActionInitialization());
다음, G4RunManager를 지우고 multi-threading을 지원하는 런 메니저인 G4MTRunManager로 바꿔주자.
G4MTRunManager* runManager = new G4MTRunManager;
물론 헤더 도 추가해야 한다.
#include "G4MTRunManager.hh" #include "OTActionInitialization.hh"
사용자가 사용하고 싶은 스레드의 개수는 (예를 들어서 4개일 때)
runManager -> SetNumberOfThreads(4);
와 같이 설정한다.
OTActionInitialization
앞의 토픽에서 이야기 했듯이 마스터 스레드는 Run Action 클래스 만 생성하고 하위 스레드는 모든 Action 클래스를 생성하므로 OTActionInitialization(소스, 헤더) 클래스의 본체는 다음과 같다.
void OTActionInitialization::BuildForMaster() const { SetUserAction(new OTMasterRunAction("../primaries.gen")); } void OTActionInitialization::Build() const { SetUserAction(new OTPrimaryGeneratorAction); SetUserAction(new OTRunAction); SetUserAction(new OTEventAction); SetUserAction(new OTSteppingAction); }
BuildMaster() 함수에서 OTRunAction이 아닌 OTMasterRunAction을 사용한 점을 유의하자(다음 토픽에서 다룰 예정).