2013-01-10 19 views
5

यह नीचे मेरे टेस्ट कोड में थ्रेडसेफ जैसा लगता है। क्या मैं मल्टीथ्रेड प्रोग्राम में Poco::Logger का उपयोग कर सकता हूं?क्या पॉको :: लॉगर थ्रेडसेफ है?

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); 
     } 
     } 
}; 

यहाँ परीक्षण मुख्य है:

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

[यह पृष्ठ] (http://www.appinf.com/docs/poco/Poco.Logger.html) केवल इतना कहता है कि 'unsafeGet' थ्रेड सुरक्षित नहीं है, इसलिए मुझे लगता है कि बाकी हैं। – chris

+0

आम तौर पर, जब तक स्पष्ट रूप से निर्दिष्ट नहीं किया जाता है, आपको हमेशा कार्यक्षमता पर विचार करना चाहिए क्योंकि _not_ थ्रेड सुरक्षित है। –

उत्तर

9

यह सवाल बहुत पुराना है, लेकिन मैं एक ही संदेह नहीं था, इसलिए पुस्तकालय फोरम मैंने पाया पर देख: http://pocoproject.org/forum/viewtopic.php?f=12&t=1233&p=2681&hilit=logger#p2681
महत्वपूर्ण उद्धरण है: "लॉगर अलग लॉगिंग फ़ंक्शन के संबंध में थ्रेड सुरक्षित है। यदि आप लॉगर से जुड़े चैनल को बदलने का प्रयास करते हैं, जबकि अन्य थ्रेड वर्तमान में लॉगर का उपयोग कर रहा है, तो इससे समस्याएं पैदा हो सकती हैं।"

+0

कृपया उन्हें पोस्ट करने के बजाय लिंक सारांशित करें। –

+0

तो दिन का उद्धरण है: "लॉगर अलग लॉगिंग फ़ंक्शन के संबंध में थ्रेड सुरक्षित है। यदि आप लॉगर से जुड़े चैनल को बदलने का प्रयास करते हैं, जबकि अन्य थ्रेड वर्तमान में लॉगर का उपयोग कर रहा है, तो इससे समस्याएं हो सकती हैं।" –

+0

धन्यवाद, ऊपर उठाया गया। आपको अपनी पोस्ट को संशोधित करना चाहिए (इसे एक टिप्पणी के रूप में छोड़कर)। –

संबंधित मुद्दे