首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >2012年Visual中的C++11魔术静态解决方案

2012年Visual中的C++11魔术静态解决方案
EN

Stack Overflow用户
提问于 2017-12-06 06:54:50
回答 1查看 365关注 0票数 0

我将一些对象定义为全局对象,这意味着它们的构造函数是在程序开始之前或在DllMain()下输入的。这会导致一些问题,这就是为什么我想将它们移到本地静态。

我们的主要项目主要在Visual 2012下进行。根据这些帖子。

魔术统计在Visual 2012中没有实现(直到VS 2015)。因此,本地静态变量初始化不会自动受到编译器并发访问的保护。

什么是适合这种情况的解决办法或解决方案?

以下是我尝试过的:

加一个锁来保护。但是如果在输入函数之前初始化了变量,我的锁可能是无用的.

代码语言:javascript
运行
复制
// data object
struct Cat
{
    Cat()
    {
        std::cout << __FUNCTION__ <<  "\n";
    }
};

// lock mutex for singleton getter
static std::mutex getcat_m;

// singleton getter
Cat& GetCat(){
    std::cout << __FUNCTION__ <<  " In\n";

    std::lock_guard<std::mutex> lk(getcat_m);
    static Cat cat;

    std::cout << __FUNCTION__ <<  " Out\n";
    return cat;
}

int main(int argc, char* argv[])
{
    std::cout << __FUNCTION__ <<  " In\n";
    Cat& cat = GetCat();
    std::cout << __FUNCTION__ <<  " Out\n";

    std::cin.ignore();
    return 0;
}

它实际上如预期的那样显示出来。在输入函数之后调用构造函数。

代码语言:javascript
运行
复制
main In
GetCat In
Cat::Cat
GetCat Out
main Out

但我不知道这是否一个合适的解决办法。

EN

回答 1

Stack Overflow用户

发布于 2017-12-06 08:50:24

感谢A. A在评论中的链接一次而不是双重检查的锁定模式

我引用了Guildline中的示例,并将我的单例getter代码重写如下。

代码语言:javascript
运行
复制
// Cat.cpp
static std::once_flag once_Cat;
static Cat* gpCat = nullptr;
void init_Cat() { gpCat = new Cat(); }

Cat& GetCat() {
    std::call_once(once_Cat, init_Cat);
    return *gpCat;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47668537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档