c++ - std::mutex 和 std::atomic 的链接问题

标签 c++ multithreading c++11 visual-studio-2013 stdatomic

<分区>

我有这个:

单例.h

#ifndef SINGLETON_H
#define SINGLETON_H

#include <atomic>
#include <mutex>

class Singleton
{
public:
    static std::atomic<Singleton*> Singleton::m_instance;
    static std::mutex Singleton::m_mutex;
    static Singleton* getInstance();

    Singleton();
    ~Singleton();
};

#endif

单例.cpp

#include "Singleton.h"

Singleton::Singleton()
{
}

Singleton* Singleton::getInstance() 
{
    Singleton* tmp = m_instance.load(std::memory_order_relaxed);
    std::atomic_thread_fence(std::memory_order_acquire);
    if (tmp == nullptr) 
    {
        std::lock_guard<std::mutex> lock(m_mutex);
        tmp = m_instance.load(std::memory_order_relaxed);
        if (tmp == nullptr) 
        {
            tmp = new Singleton;
            std::atomic_thread_fence(std::memory_order_release);
            m_instance.store(tmp, std::memory_order_relaxed);
        }
    }
    return tmp;
}

Singleton::~Singleton() {}

主要.cpp

#include "Singleton.h"
#include <iostream>
int main()
{
    Singleton* singleton = Singleton::getInstance();
    std::cout << "Hello World!" << std::endl;
    return 0;
}

当我尝试构建时出现此错误(Visual Studios):

Error 1 error LNK2001: unresolved external symbol "public: static struct std::atomic Singleton::m_instance" (?m_instance@Singleton@@2U?$atomic@PAVSingleton@@@std@@A) c:...Singleton.obj Singleton

和:

Error 2 error LNK2001: unresolved external symbol "public: static class std::mutex Singleton::m_mutex" (?m_mutex@Singleton@@2Vmutex@std@@A) c:\Users\InusualZ\documents\visual ...Singleton.obj Singleton

最佳答案

您需要在源文件中定义静态成员变量,而不仅仅是在类定义中声明它们:

std::atomic<Singleton*> Singleton::m_instance;
std::mutex Singleton::m_mutex;

您可能有兴趣知道您可以使用一个简单的本地静态变量实现几乎完全相同的惰性线程安全初始化:

Singleton* Singleton::getInstance() {
    static Singleton instance;
    return &instance;
}

这修复了内存泄漏,但如果您尝试从另一个静态变量的析构函数访问它,则会引入潜在的死亡陷阱。如果没有某种问题,就无法在 C++ 中实现 Singleton 反模式。你应该think again关于单例是否适合你的设计。根据我的经验,它永远不会。

关于c++ - std::mutex 和 std::atomic 的链接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27192645/

相关文章:

c++ - 自然算术 C++ 总是返回 1

android - AsynckTask.onPostExecute 和 FragmentActivity.onResumeFragments 是否在同一线程(ui 线程)上运行?

c++ - C++11 是否强制 pow(double, int) 使用较慢的 pow(double, double)?

c++ - constexpr 是否暗示内联?

c++ - std::thread::id 的要求。可以雾化吗?

c++ - Arm 内联汇编 volatile 导致 clang 与 asan 计算结果错误

c++ - 使用 Lua 从 C++ 修改 XML 字符串

c - 如何在 posix 线程之间发出缓冲区已满状态的信号

multithreading - 当事件模式不适用时,线程应该休眠多长时间?

c++ - QTableView 比它的容器大