根据您提供的代码,我注意到您的累加计数器可能没有正确工作的原因是,每次执行EndOfEventAction函数时,您都会创建一个新的EventAction对象,而每个对象都有自己的TotalCount和TempCount变量。这导致了每次累加都是从零开始。
为了解决这个问题,您可以将TotalCount和TempCount声明为静态成员变量,这样它们将在所有EventAction对象之间共享。此外,您需要在类外定义这些静态成员变量。下面是修改后的代码示例:
.B1EventAction.h#ifndef B1EventAction_h#define B1EventAction_h 1#include "G4UserEventAction.hh"#include "globals.hh"#include <mutex>namespace B1 {class RunAction;class EventAction : public G4UserEventAction {public: EventAction(RunAction* runAction); ~EventAction() override; void BeginOfEventAction(const G4Event* event) override; void EndOfEventAction(const G4Event* event) override;private: static std::mutex myLock; // 用于保护需要同步的资源 static G4int TotalCount; static G4int TempCount;};}#endif
.B1EventAction.cc#include "B1EventAction.hh"#include "B1RunAction.hh"#include "G4Event.hh"#include "G4RunManager.hh"#include "G4UnitsTable.hh"#include <mutex>using namespace B1;std::mutex EventAction::myLock;G4int EventAction::TotalCount = 0;G4int EventAction::TempCount = 0;EventAction::EventAction(RunAction* runAction) : G4UserEventAction(), fRunAction(runAction) {}EventAction::~EventAction() {}void EventAction::BeginOfEventAction(const G4Event*) { fEdep = 0.;}void EventAction::EndOfEventAction(const G4Event* aEvent) { std::lock_guard<std::mutex> lock(myLock); // 加锁 TotalCount++; TempCount++; G4cout << "*!!!!!!!!!!!!!!!!!![b][/b]*** EndOfEventAction, TotalCount: " << TotalCount << G4endl;}
这样修改后,TotalCount和TempCount将作为类的静态成员变量,被所有的EventAction对象共享。加锁操作也会确保在修改这些变量时的线程安全性。
希望这次回答能够解决您的问题。如果还有其他问题,请随时提问。
如果回答对你有帮助,请给我一个最佳答案!
|