gpt4 book ai didi

C++11 多线程问题

转载 作者:行者123 更新时间:2023-11-28 07:17:51 25 4
gpt4 key购买 nike

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

试过这个,失败了(不知何故,在 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::mutex为你std::stringstream (就我个人而言,我只会使用 std::queue<std::string>,但这是一个单独的问题。
  2. 您的记录器线程不应轮询输入。相反,它应该只是 wait()std::condition_variable 上成为notify_one() d 关于可用数据。
  3. 虽然它只是一个bool , 你 running flag也需要同步!如果任何线程一个变量由另一个线程在没有同步的情况下写入,这就是数据竞争。对于 running标记您可能想要使用 std::atomic<bool> .

关于C++11 多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19942141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com