Multithreading 螺纹不';t与主螺纹连接

Multithreading 螺纹不';t与主螺纹连接,multithreading,c++11,Multithreading,C++11,我的logger类有问题。 代码如下: #include "Logger.h" Logger::Logger() { fileName = new string("log.txt"); out = new ofstream(*fileName, ofstream::out); stream = new vector<string>; changed = new bool; condition = new condition_variable;

我的logger类有问题。 代码如下:

#include "Logger.h"

Logger::Logger()
{
    fileName = new string("log.txt");
    out = new ofstream(*fileName, ofstream::out);
    stream = new vector<string>;
    changed = new bool;
    condition = new condition_variable;
    myMutex = new mutex;
    running = new bool;

    if (running)
    {
        PostQuitMessage(500);
    }

    if (!out->is_open())
    {
        exit(3);
    }
    *running = false;

    T = new thread(&Logger::myrun, this);
}

Logger::~Logger()
{
    delete fileName;
delete out;
delete stream;
delete changed;
delete condition;
delete myMutex;
delete running;
delete T;
}

void Logger::myrun()
{
    *running = true;

    while (*running)
    {
        unique_lock<mutex> lock(*myMutex);
        condition->wait(lock, [this] { return *changed; });

        for (int c = 0; c < stream->size(); c++)
        {
            *out << stream->at(c) << endl;
        }

        stream->clear();

        *changed = false;
    }
    Sleep(100);
}

void Logger::log(string msg)
{
    unique_lock<mutex> lock(*myMutex);

    stream->push_back(msg);

    *changed = true;
    condition->notify_one();
}

void Logger::stop()
{
    *running = false;
    *changed = true;
    condition->notify_one();
    T->join();
    out->close();
}
#包括“Logger.h”
记录器::记录器()
{
fileName=新字符串(“log.txt”);
out=新的ofstream(*文件名,ofstream::out);
流=新向量;
更改=新布尔;
条件=新条件变量;
myMutex=新的互斥体;
运行=新布尔;
如果(正在运行)
{
发帖信息(500);
}
如果(!out->处于打开状态())
{
出口(3);
}
*运行=错误;
T=新线程(&Logger::myrun,this);
}
记录器::~Logger()
{
删除文件名;
删除;
删除流;
删除更改;
删除条件;
删除myMutex;
删除运行;
删除T;
}
void记录器::myrun()
{
*运行=真;
同时(*运行)
{
唯一的锁(*myMutex);
条件->等待(锁定,[this]{return*changed;});
对于(int c=0;csize();c++)
{
*在(c)处清除();
*更改=错误;
}
睡眠(100);
}
void Logger::log(字符串msg)
{
唯一的锁(*myMutex);
流->推回(msg);
*更改=正确;
条件->通知一个();
}
void记录器::stop()
{
*运行=错误;
*更改=正确;
条件->通知一个();
T->join();
out->close();
}
线程挂在T->join()行之后

我的问题是-为什么它挂起?我应该如何解决它?请在代码中显示:)

提前谢谢


另外,所有变量都是指针,因为我使用的这段代码是在dllexport中,VS给了我很多警告,它“需要有dll接口才能被“Logger”类的客户端使用”。如果有人对此有一些建议-欢迎发布:D

我将析构函数代码放入方法stop并在加入线程后关闭文件,从而解决了这个问题。我认为

哪个T->join()?你的stop()方法或析构函数中的一个?在T->join()之后输出->close()可能是个好主意。停止dtor中的线程通常不是一个好主意,因为当dtor调用开始时,对象的生命周期就结束了。嗯……这很尴尬。更改了某些内容(不记得是什么),去了小男孩的房间,回来了,试着运行它,它成功了…不知道为什么。你是否调用
Logger::stop
?如果是这样,你调用
join
两次。我是UB。你在那里也有很多竞争条件。创建线程后,所有对变量的访问都应该受到互斥锁的保护。我恢复了你的编辑,因为添加StackOverflow的工作原理不是在标题上添加[FIXED]并在文本中进行解释。如果您想回答自己的问题来解释您找到的解决方案,您可以这样做。您甚至可以认为答案是正确的(尽管这样做不会给您带来任何声誉)。谢谢。:-)