ATL 宏中的警告 C4640 END_CONNECTION_POINT_MAP
Warning C4640 in ATL Macro END_CONNECTION_POINT_MAP
我收到警告
warning C4640: '_entries': construction of local static object is not thread-safe
来自 ATL 宏 END_CONNECTION_POINT_MAP,例如
BEGIN_CONNECTION_POINT_MAP(CMBusInclinometerTemChannel)
CONNECTION_POINT_ENTRY(__uuidof(IChannelEvents))
END_CONNECTION_POINT_MAP()
在 C++ ATL/COM 项目中。
我认为自从安装 Visual Studio 2015 更新 2 后就开始出现这种情况。
有人能解决这个问题吗?
我认为这可能是一个新警告,但不是 - it was earlier just turned off by default。我想这是一个长期存在的 "problem",但是将其转换为真正的错误可能并不那么容易(如果可能的话并且有副作用)。
问题是关于在内部使用静态局部变量 _entries
的连接点映射,它在首次使用时以 thread-unsafe 方式初始化。然而,它是指针指向的具有固定值的指针的初始化。问题可能是线程 #1 将 map 视为已初始化,而线程 #2 正处于初始化过程中。非常罕见的情况,难怪到目前为止没有投诉。
解决方法可能是用全局临界区锁围绕静态变量初始化,例如
ATLASSERT(_pAtlModule);
CComCritSecLock<CComCriticalSection> Lock(_pAtlModule->m_csStaticDataInitAndTypeInfo);
static ...
在地图宏中,并使用 #pragma
抑制警告。这应该是 ATL headers 代码 (atlcom.h) 中的修复。
我收到警告
warning C4640: '_entries': construction of local static object is not thread-safe
来自 ATL 宏 END_CONNECTION_POINT_MAP,例如
BEGIN_CONNECTION_POINT_MAP(CMBusInclinometerTemChannel)
CONNECTION_POINT_ENTRY(__uuidof(IChannelEvents))
END_CONNECTION_POINT_MAP()
在 C++ ATL/COM 项目中。
我认为自从安装 Visual Studio 2015 更新 2 后就开始出现这种情况。
有人能解决这个问题吗?
我认为这可能是一个新警告,但不是 - it was earlier just turned off by default。我想这是一个长期存在的 "problem",但是将其转换为真正的错误可能并不那么容易(如果可能的话并且有副作用)。
问题是关于在内部使用静态局部变量 _entries
的连接点映射,它在首次使用时以 thread-unsafe 方式初始化。然而,它是指针指向的具有固定值的指针的初始化。问题可能是线程 #1 将 map 视为已初始化,而线程 #2 正处于初始化过程中。非常罕见的情况,难怪到目前为止没有投诉。
解决方法可能是用全局临界区锁围绕静态变量初始化,例如
ATLASSERT(_pAtlModule);
CComCritSecLock<CComCriticalSection> Lock(_pAtlModule->m_csStaticDataInitAndTypeInfo);
static ...
在地图宏中,并使用 #pragma
抑制警告。这应该是 ATL headers 代码 (atlcom.h) 中的修复。