2013-01-10 16 views
5

Es scheint wie threadsafe in meinem Testcode unten. Kann ich Poco::Logger in einem Multithread-Programm verwenden?Ist Poco :: Logger threadsafe?

static Poco::Logger *pLogger;  
class MyRunnable : public Poco::Runnable { 
    private: 
     std::string _name; 
     Poco::Random _rnd; 
    public: 
     void setName(std::string name) { 
      _name = name; 
     } 
     void run() { 
     for (int i=0; i<200; i++) { 
      pLogger->information("info from: " + _name); 
      _rnd.seed(_rnd.next(65532) * _name.size()); 
      Poco::Thread::sleep(_rnd.next(13) + 1); 
     } 
     } 
}; 

hier ist Testhaupt:

int 
main (int argc, char *argv[]) 
{ 
    Poco::Thread thr1, thr2, thr3; 
    MyRunnable *pMyR1 = new MyRunnable(), 
       *pMyR2 = new MyRunnable(), 
       *pMyR3 = new MyRunnable(); 
    pMyR1->setName("r1"); 
    pMyR2->setName("ra2"); 
    pMyR3->setName("runable3"); 

    Poco::FormattingChannel *pFCFile = new Poco::FormattingChannel(new Poco::PatternFormatter("%Y-%m-%d %H:%M:%S.%c %N[%P]:%s: %q:%t")); 
    pFCFile->setChannel(new Poco::FileChannel("test.log")); 
    pFCFile->open(); 
    pLogger = &(Poco::Logger::create("FileLogger", pFCFile, Poco::Message::PRIO_INFORMATION)); 


    thr1.start(*pMyR1); 
    thr2.start(*pMyR2); 
    thr3.start(*pMyR3); 

    std::cout << "starting..." << std::endl; 
    thr1.join(); 
    thr2.join(); 
    thr3.join(); 
    std::cout << "end." << std::endl; 
    return EXIT_SUCCESS; 
}   /* ---------- end of function main ---------- */ 
+2

[Diese Seite] (http://www.appinf.com/docs/poco/Poco.Logger.html) sagt nur, 'unsafeGet' ist nicht Thread-sicher, also nehme ich an, der Rest ist. – chris

+0

Im Allgemeinen sollten Sie, sofern Sie nicht explizit angegeben sind, die Funktionalität immer als nicht sicher betrachten. –

Antwort

9

Diese Frage ist sehr alt, aber ich hatte den gleichen Zweifel, so auf die Bibliothek Forum Suche gefunden: http://pocoproject.org/forum/viewtopic.php?f=12&t=1233&p=2681&hilit=logger#p2681
Das wichtige Zitat ist: "Der Logger ist threadsicher in Bezug auf die verschiedenen Protokollierungsfunktionen. Wenn Sie versuchen, den an einen Logger angeschlossenen Kanal zu wechseln, während ein anderer Thread gerade den Logger verwendet, kann dies zu Problemen führen."

+0

Bitte fassen Sie die Links zusammen, anstatt sie nur zu posten. –

+0

Also das Zitat des Tages ist: "Der Logger ist thread sicher in Bezug auf die verschiedenen Logging-Funktion. Wenn Sie versuchen, den mit einem Logger verbundenen Kanal zu ändern, während ein anderer Thread den Logger verwendet, kann dies zu Problemen führen." –

+0

Danke, upvoted. Sie sollten Ihren Beitrag ändern (anstatt ihn als Kommentar zu hinterlassen). –