使用单例模式的线程安全Logger对象

时间:2014-11-04 11:56:20

标签: c++ multithreading qt thread-safety singleton

我应该为应用程序实现一个记录器,我应该使用单例模式。此外,由于此应用程序是多线程的,因此该记录器应该是线程安全的。我想指出我必须使用 C ++ 03

我使用QMutex静态对象在C ++ / QT中看到this implementation of singleton pattern,以保证只有一个线程分配单个对象的唯一实例。

为什么每个人都将单例作为指针返回?我会将它作为参考返回,所以我不应该担心显式释放单例对象使用的内存。我阅读了this answerthis other answer,并编写了以下实现。

// ==========
// Logger.h

#include <QMutex>
#include <QString>

class Logger
{
public:
    static Logger& instance();

    void configure(const QString& folder);

private:
    Logger();
    Logger(const Logger&);
    Logger& operator=(const Logger&);

private:
    mutable QMutex _mutex;
    QString _folder;
};


// ==========
// Logger.cpp

Logger::Logger() : _mutex() { ; }

Logger& Logger::instance()
{
    static QMutex mutex;

    mutex.lock();
    static Logger instance;
    mutex.unlock();

    return instance;
}

void Logger::configure(const QString& folder)
{
    _mutex.lock();
    _folder = folder;
    _mutex.unlock();
}

我有一些问题......

  1. 创建唯一实例时,函数instance()是否是线程安全的?
  2. 在破坏对象时,单例对象是否会以线程安全方式销毁?

0 个答案:

没有答案