根据您的描述,您希望在执行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())。
请注意,您需要根据实际情况在代码中适当添加创建文件夹的逻辑。
希望以上解决方案满足了您的需求。如果您有任何其他问题,请随时提问。
如果回答对你有帮助,请给我一个最佳答案!
|