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)
这是什么意思?什么时候返回语句会抛出异常?请帮我解决这个问题......
虽然这不能回答您的特定问题,但它仍然是您整体问题的解决方案:您根本不需要互斥锁.C++ 11标准[stmt.dcl]§4指定(当谈论static函数的局部变量时):
如果控制在初始化变量时同时进入声明,则并发执行应等待初始化完成.88如果控件在初始化变量时以递归方式重新输入声明,则行为未定义.
注88是:
注88:实现不得在执行初始化程序时引入任何死锁.
换句话说,编译器为您引入了同步; 无需手动执行此操作.
| 归档时间: |
|
| 查看次数: |
1050 次 |
| 最近记录: |