0

所以我开始写一个游戏,我想要一个不同线程的记录器。我的方法是:有一个“Logger”类,在构造函数中运行一个线程,在线程中有一个循环运行,它不断检查字符串流中的数据。该字符串流是一个静态变量,所以我在程序的入口点运行记录器,然后每当我需要记录某些内容时,我调用一个静态方法写入静态字符串流,该方法每 100 毫秒读取一次线。所以我想知道这种方法在游戏编程中是否可行,如果它有点好,我应该如何处理?

试过这个,它失败了(不知何故在睡眠(100)之后抛出一个未处理的异常,而不是继续循环......)

class Logger
{
private:
    ofstream out;
    string fileName;
    thread T;
    bool running;

    static stringstream sstream;

    void run();

public:
    Logger();
    ~Logger();

    void stop();

    static void log(string msg);

    void join();
};

stringstream Logger::sstream;

Logger::Logger()
{
    fileName = "log.txt";
    out = ofstream(fileName);
    if (!out.is_open())
    {
        PostQuitMessage(3);
    }
    running = false;
    T = thread(&Logger::run, this);
}

Logger::~Logger()
{
    out.close();
}

void Logger::run()
{
    running = true;
    while (running)
    {
        if (!sstream.str().empty())
        {
            out << sstream.str();
            sstream.clear();
        }
        Sleep(100);
    }
}

void Logger::stop()
{
    running = false;
}

void Logger::log(string msg)
{
    Logger::sstream << "lel" << endl;
}

void Logger::join()
{
    T.join();
}
4

1 回答 1

1

肯定有一个直接的问题:

  1. 没有同步会导致未定义的行为。您需要创建适当的同步,例如,std::mutex为您使用 a std::stringstream(就个人而言,我只是使用 astd::queue<std::string>但这是一个单独的问题。
  2. 您的记录器线程不应轮询输入。相反,它应该只是wait()关于std::condition_variable可用notify_one()数据。
  3. 虽然只是一个bool,你的runningflag也需要同步!如果任何线程的变量由另一个线程写入而没有同步,这就是数据竞争。对于running标志,您可能需要使用std::atomic<bool>.
于 2013-11-12T23:33:58.333 回答