C++11 多线程问题

C++11 having problems with multithreading

本文关键字:问题 多线程 C++11      更新时间:2023-10-16

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

尝试了这个,这是失败的(不知何故,某些东西在 Sleep(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();
}

当然有一个直接的问题:

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