我正在尝试创建一个日志记录类,其中调用写日志的操作是静态的。现在,由于性能要求,我希望在单独的线程中执行实际的日志记录。由于写入日志的函数是静态的,所以我认为线程也需要是静态的,这也与另一个静态成员函数绑定,该函数执行实际的日志写入操作。我尝试编写代码,但某种方式会导致在静态线程初始化期间挂起。以下是复制行为的代码示例:
我发现的一个奇怪的问题是只有在将类打包成DLL时才会出现挂起的情况。如果我直接将类文件用于控制台EXE项目中,似乎一切正常。
所以,我的问题基本上是挂起的部分和我是否正确地做了事情。
提前感谢您...
"Logger.h"
#ifndef LOGGER_H
#define LOGGER_H
#include <condition_variable>
#include <mutex>
#include <queue>
#include <string>
#include <thread>
#include <vector>
#define LIBRARY_EXPORTS
#ifdef LIBRARY_EXPORTS // inside DLL
#define LIBRARY_API __declspec(dllexport)
#else // outside DLL
#define LIBRARY_API __declspec(dllimport)
#endif
using namespace std;
namespace Company { namespace Logging {
class LIBRARY_API Logger
{
public:
~Logger();
void static Write(string message, vector<string> categories = vector<string>());
private:
Logger();
Logger(Logger const&) {}
void operator=(Logger const&) {}
static thread processLogEntriesThread;
static void ProcessLogEntries();
};
}}
#endif
"Logger.cpp"
#include "Logger.h"
#include <iostream>
using namespace std;
namespace Company { namespace Logging {
thread Logger::processLogEntriesThread = thread(&Logger::ProcessLogEntries);
Logger::Logger()
{
}
Logger::~Logger()
{
Logger::processLogEntriesThread.join();
}
void Logger::Write(string message, vector<string> categories)
{
cout << message << endl;
}
void Logger::ProcessLogEntries()
{
}
}}
我发现的一个奇怪的问题是只有在将类打包成DLL时才会出现挂起的情况。如果我直接将类文件用于控制台EXE项目中,似乎一切正常。
所以,我的问题基本上是挂起的部分和我是否正确地做了事情。
提前感谢您...
Write
调用中,你需要一个互斥锁。此外,你实际上正在创建一个单例...一个静态类。当你这样做时,你必须小心初始化和对象永远不会真正被销毁。 - Gort the RobotCreateThread
在DLL启动期间创建(请参见底部),但不能保证使用std::thread
。 - dyp