ログを書き込む呼び出しが静的なロギング クラスを作成しようとしています。ここで、パフォーマンス要件のために、実際のログ記録を別のスレッドで実行したいと考えています。ログに書き込む関数は静的なので、スレッドも静的である必要があると思います。これは、ログの実際の書き込みを実行する別の静的メンバー関数にも関連付けられています。コーディングしてみましたが、静的スレッドの初期化中に何らかの理由でハングします。動作を再現するコード サンプルは次のとおりです。
「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
「ロガー.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()
{
}
}}
私が見つけた奇妙な動作の 1 つは、クラスが DLL にパッケージ化されている場合にのみ、ハング部分が発生することです。クラス ファイルをコンソール EXE プロジェクトに直接使用すると、動作しているように見えます。
したがって、基本的に私の問題はぶら下がっている部分であり、私が正しくやっている場合です。
前もって感謝します...