動態

詳情 返回 返回

C++11單例模式(線程安全) - 動態 詳情

單例模式

注意:單例模式會讓程序變得難以測試,所以儘可能不要使用單實例模式。

保證一個類只有一個實例,並且提供了訪問該實例的全局訪問點。

線程安全的單例模式-C++11

Singleton.h

#pragma once

template<typename T>
class Singleton
{
public:
    static T& instance() {
        static T instance{ token{} };
        return instance;
    }

    Singleton(const Singleton&) = delete;
    Singleton& operator= (const Singleton) = delete;

protected:
    struct token {};
    Singleton() {}
};

Example

#include <Singleton.h>
#include <iostream>
class Test final : public Singleton<Test>
{
public:
    Test(token) { std::cout << "constructed" << std::endl; }
    ~Test() {  std::cout << "destructed" << std::endl; }

    void use() const { std::cout << "in use" << std::endl; };
};

int main()
{
    // Test cannot_create; /* ERROR */

    std::cout << "Entering main()" << std::endl;
    {
        auto const& t = Test::instance();
        t.use();
    }
    {
        auto const& t = Test::instance();
        t.use();
    }
    std::cout << "Leaving main()" << std::endl;
}

隱患

如果單例類位於 dll 庫中,是否還能保證唯一?

參考文獻

1.https://codereview.stackexcha...

2.https://stackoverflow.com/que...

3.https://gameprogrammingpatter...

4.https://gpp.tkchu.me/singleto...

更新地址

C++11單例模式(線程安全)

Add a new 評論

Some HTML is okay.