根据您的描述,您希望在执行1000次event后修改step类中保存结果的文件名,并将新的文件名传递给step类。您担心这样做会导致文件名混乱。下面是我提供的解决方案,该方案通过使用互斥锁确保线程安全。
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <mutex>
- std::mutex mtx;
- class Step {
- public:
- Step(const std::string& filename) : filename(filename) {}
- void execute(int stepNumber) {
- // 操作步骤,将结果保存到文件中
- std::ofstream file;
- file.open(filename, std::ios::app);
- file << "Step " << stepNumber << " executed." << std::endl;
- file.close();
- }
- private:
- std::string filename;
- };
- class Event {
- public:
- Event(Step& step) : step(step), eventCount(0), folderIndex(0) {}
- void run() {
- while (eventCount < 1000) {
- // 执行事件
- mtx.lock();
- if (eventCount % 1000 == 0) {
- // 创建新的文件夹并更新文件名
- createFolder();
- updateFilename();
- }
- int stepNumber = eventCount % 1000;
- step.execute(stepNumber);
- eventCount++;
- mtx.unlock();
- }
- }
- private:
- Step& step;
- int eventCount;
- int folderIndex;
- std::string filenamePrefix = "results";
- void createFolder() {
- std::string folderName = filenamePrefix + "_" + std::to_string(folderIndex);
- // 在此处创建文件夹
- folderIndex++;
- }
- void updateFilename() {
- std::string newFilename = filenamePrefix + "_" + std::to_string(folderIndex) + "/results.txt";
- step.updateFilename(newFilename);
- }
- };
- int main() {
- Step step("results/results.txt");
- Event event(step);
- event.run();
- return 0;
- }
复制代码
在上述代码中,我们使用了一个互斥锁(
std::mutex mtx)来确保多线程环境下对共享资源的安全访问。在每个event中,我们首先获取锁定(
mtx.lock()),然后进行判断,如果达到每1000次的条件,就创建新的文件夹并更新step类中的文件名。然后执行step类的操作,并将步骤号传递给step类的execute函数。最后,释放锁定(
mtx.unlock())。
请注意,您需要根据实际情况在代码中适当添加创建文件夹的逻辑。
希望以上解决方案满足了您的需求。如果您有任何其他问题,请随时提问。
如果回答对你有帮助,请给我一个最佳答案!