4

ログを書き込む呼び出しが静的なロギング クラスを作成しようとしています。ここで、パフォーマンス要件のために、実際のログ記録を別のスレッドで実行したいと考えています。ログに書き込む関数は静的なので、スレッドも静的である必要があると思います。これは、ログの実際の書き込みを実行する別の静的メンバー関数にも関連付けられています。コーディングしてみましたが、静的スレッドの初期化中に何らかの理由でハングします。動作を再現するコード サンプルは次のとおりです。

「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 プロジェクトに直接使用すると、動作しているように見えます。

したがって、基本的に私の問題はぶら下がっている部分であり、私が正しくやっている場合です。

前もって感謝します...

4

3 に答える 3

0

ロガー スレッドの使用状況がわかりません。クラスのメンバーとしてスレッドを持つことは、すべてのメンバー関数が作成されたスレッドで実行されることを意味しませんでした。ロガーインスタンスがない間は、ロガーのデストラクタは呼び出されません。iostream はスレッドセーフではありません!

あなたがしなければならないこと:

ログ情報を収集するための何らかのストレージを作成します。このインスタンスはスレッドセーフでなければなりません! 外部からのメッセージをこのインスタンスにプッシュします。インスタンス自体には、ストレージから読み取り、データを出力する独自のスレッドが必要です。読み取りと書き込みは異なるスレッドから行われるため、これもスレッドセーフな方法で行う必要があります。

于 2013-09-14T09:45:18.850 に答える