C++11 多线程问题
C++11 having problems with multithreading
所以我开始写一个游戏,我想要一个不同线程中的记录器。我的方法是这样的:有一个类"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();
}
当然有一个直接的问题:
- 没有会导致未定义行为的同步。您需要创建适当的同步,例如,为您
std::stringstream
使用std::mutex
(就个人而言,我只会使用std::queue<std::string>
但这是一个单独的问题。 - 记录器线程不应轮询输入。相反,它应该只
wait()
一个std::condition_variable
,notify_one()
可用数据。 - 虽然只是一个
bool
,但你running
标志也需要同步!如果任何线程线程由另一个线程写入的变量而不同步,则这是数据竞赛。对于running
标志,您可能需要使用std::atomic<bool>
。
相关文章:
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- C++多线程生产者-消费者问题
- C++ 多线程中的锁和条件变量问题
- 多线程与线程小问题
- 多线程概念问题
- 在 Linux 中从单独的单线程进程生成多线程进程时出现问题
- 如何解决多线程绘图的问题不流畅
- C++ std::endl 的多线程程序 I/O 问题
- 我遇到了一个关于多线程的小问题.需要多线程来计算 Pi 和方差
- 多线程程序线程联接问题
- 多线程环境中的输出字符串流出现问题
- QT有问题的多线程
- C 多线程TCP服务器问题
- C++-关于多线程的问题
- 在多线程环境中使用Mysql++的问题
- Borland C++-多线程TCPServer问题
- gdal多线程问题
- 从多线程.net应用程序调用的本机dll中的tbb存在问题
- 有关 dup2 和多线程的问题