小编Inu*_*alZ的帖子

std::mutex 和 std::atomic 的链接问题

我有这个:

单例.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
Run Code Online (Sandbox Code Playgroud)

单例.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() {}
Run Code Online (Sandbox Code Playgroud)

主程序

#include "Singleton.h"
#include <iostream>
int main()
{
    Singleton* singleton …
Run Code Online (Sandbox Code Playgroud)

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

5
推荐指数
1
解决办法
4226
查看次数