根据您提供的代码,我注意到您的累加计数器可能没有正确工作的原因是,每次执行
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对象共享。加锁操作也会确保在修改这些变量时的线程安全性。
希望这次回答能够解决您的问题。如果还有其他问题,请随时提问。
如果回答对你有帮助,请给我一个最佳答案!