2013-01-10 37 views
5

Dường như luồng an toàn trong mã thử nghiệm của tôi bên dưới. Tôi có thể sử dụng Poco::Logger trong một chương trình đa luồng không?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); 
     } 
     } 
}; 

đây là thử nghiệm chính:

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

[Trang này] (http://www.appinf.com/docs/poco/Poco.Logger.html) chỉ nói 'unsafeGet' không phải là chuỗi an toàn, vì vậy tôi giả sử phần còn lại là. – chris

+0

Nói chung, trừ khi được chỉ định rõ ràng, bạn nên luôn xem xét chức năng như _not_ là chuỗi an toàn. –

Trả lời

9

Câu hỏi này là rất cũ, nhưng tôi đã có nghi ngờ tương tự, vì vậy tìm kiếm trên thư viện diễn đàn tôi thấy: http://pocoproject.org/forum/viewtopic.php?f=12&t=1233&p=2681&hilit=logger#p2681
Đoạn trích dẫn quan trọng là: "Logger là luồng an toàn liên quan đến chức năng ghi nhật ký khác nhau. Nếu bạn cố gắng thay đổi Kênh được kết nối với Trình ghi trong khi một luồng khác hiện đang sử dụng Trình ghi nhật ký, điều này có thể dẫn đến sự cố."

+0

Vui lòng tóm tắt các liên kết thay vì chỉ đăng chúng. –

+0

Vì vậy, các báo giá trong ngày là: "Logger là chủ đề an toàn liên quan đến chức năng đăng nhập khác nhau. Nếu bạn cố gắng thay đổi kênh kết nối với một Logger trong khi thread khác hiện đang sử dụng Logger, điều này có thể dẫn đến vấn đề." –

+0

Cảm ơn, đã bỏ phiếu. Bạn nên sửa đổi bài viết của mình (để lại nó dưới dạng bình luận). –