1

みんな、私はスレッド化とロギングの初心者です。ところで、私は英語を母国語としないので、英語に誤りがあればご容赦ください。

各スレッドが次のようなログ モジュールを使用するマルチスレッドソフトウェアを作成しました。

__inline void print_logW(int _level,const wchar_t *domain,const wchar_t *msg)
{
    wchar_t mess[200] = _T("");

    if(_level<=traceLevel)
    {
        __time64_t timer;
        struct tm t_st;
        _time64(&timer);

        localtime_s(&t_st,&timer);

        if (domain == NULL)
        {
            domain = _T("");
        }
        if (msg != NULL)
        {
            if (showTimeStampFlag == true)
            {
                swprintf_s(mess,200,_T("%s : %ld"),msg,GetTickCount());
            }
            else
            {
                wcscpy_s(mess,200,msg);
            }
        }

        if(oldTime.tm_year != t_st.tm_year || oldTime.tm_mon != t_st.tm_mon || oldTime.tm_mday != t_st.tm_mday) 
        {
            oldTime = t_st;
            print_log_preparebyDateW();
        }


        FILE* fp;
        errno_t err = _wfopen_s(&fp, this->m_pathW, _T("at+, ccs=UTF-8"));
        if (err != 0)
        {
            // error
            return;
        }

        fwprintf_s(fp, m_logFormatW,
            _level,
            1900 + t_st.tm_year, t_st.tm_mon + 1, t_st.tm_mday,
            t_st.tm_hour, t_st.tm_min, t_st.tm_sec,
            domain, mess
            );
        fflush(fp);
        fclose(fp);
    }
}

作ったソフトのログを見るとスレッド処理が遅くなる(画像のポインタを取得するなど)通常16ミリ秒しかかからない処理が0.2秒以上かかってしまう問題を発見。終わる)。この問題の原因については現在も調査中ですが、まず、ロギング モジュールが既にスレッド セーフになっているかどうかを知りたいと思います。

ちなみに、パラメータ について
"_level"は、プロセスの詳細を印刷または非印刷するロギング レベルです。、
"domain"
"msg"

m_logFormatW

m_logFormatW = _T("[%.2d][%.4d-%.2d-%.2dT%.2d:%.2d:%.2d][%s] %s\n");

ご不明な点やご不明な点がございましたら、お気軽にお尋ねください。

4

2 に答える 2

0

ログメッセージリクエストをシリアル化していないため、アプローチはシングルスレッドアプリケーションに適していますが、マルチスレッド環境では機能しません。

次のようなオープンソースで適切に作成されたロガークラスを調べることをお勧めします

a) AsynchronousAndSynchronouslogger - http://www.codeproject.com/Articles/288827/g2log-An-effective-asynchronous-logger-using-Cplus

b) シンプルスレッドセーフ - http://cpplogging.codeplex.com/

c) Log4Cpp - http://log4cpp.sourceforge.net/

于 2013-06-17T03:41:50.813 に答える