Singleton构造函数失败了c ++ - 可能是什么?

A.V*_*.V. 1 c++ singleton mfc mutex exception

我实际上面临着一个巨大的问题:我有一个单身课程.我的程序是一个多线程MFC,因此可以从不同的线程调用单例的构造函数.我用一个互斥体包围了单例实例 - getter函数,以避免死锁和多个构造.下面的调用意味着函数在第一次直接失败.

该函数看起来像(LOG_MSG宏将给定的字符串记录到我的日志文件中):

MyClass& MyClass::singleton ()
{
    LOG_MSG("MyClass::singleton -> jump in");

    static CMutex oInitMutex;
    try
    {
        CSingleLock oSingleLock((CSyncObject *) &oInitMutex, TRUE);
        LOG_MSG("!!! SINGLETON LOCK OKAY !!!");
        static MyClass oMyClassInstance;
        LOG_MSG("!!! SINGLETON CONSTRUCTION OKAY !!!");
        return oMyClassInstance;
    }
    catch(...)
    {
        CString excMsg("Unexpected exception by creating MyClass singleton instance!");
        LOG_MSG(excMsg);
        throw excMsg;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经想通了,单例对象的构造不会失败(因为我们得到了"!!! SINGLETON CONSTRUCTION OKAY !!!"消息).

日志输出说:

09.04.2013 ;07:14:51:832;"MyClass::singleton -> jump in"
09.04.2013 ;07:14:51:841;"!!! SINGLETON LOCK OKAY !!!"
... (constructor logs => NOTHING unexpected in it!!! everything runs fine, as they must!!!)
09.04.2013 ;07:14:52:125;"!!! SINGLETON CONSTRUCTION OKAY !!!"
09.04.2013 ;07:14:52:170;"Unexpected exception by creating MyClass singleton instance!"
Run Code Online (Sandbox Code Playgroud)

这是什么意思?什么时候返回语句会抛出异常?请帮我解决这个问题......

Rei*_*ica 6

虽然这不能回答您的特定问题,但它仍然是您整体问题的解决方案:您根本不需要互斥锁.C++ 11标准[stmt.dcl]§4指定(当谈论static函数的局部变量时):

如果控制在初始化变量时同时进入声明,则并发执行应等待初始化完成.88如果控件在初始化变量时以递归方式重新输入声明,则行为未定义.

注88是:

注88:实现不得在执行初始化程序时引入任何死锁.

换句话说,编译器为您引入了同步; 无需手动执行此操作.

  • @AV:在这种情况下,(a)你会遇到很多问题; (b)当你需要帮助时,你最好提一下你正在使用史前编译器,因为你使用的语言与现代C++几乎没有相似之处. (2认同)