2016-04-05 3 views
2

Я получаю предупреждениеПредупреждение C4640 в АТЛ Macro END_CONNECTION_POINT_MAP

warning C4640: '_entries': construction of local static object is not thread-safe 

от макро END_CONNECTION_POINT_MAP АТЛ, например

BEGIN_CONNECTION_POINT_MAP(CMBusInclinometerTemChannel) 
    CONNECTION_POINT_ENTRY(__uuidof(IChannelEvents)) 
END_CONNECTION_POINT_MAP() 

в/COM проекта C++ ATL.

Я думаю, что это начало происходить после установки Visual Studio 2015 обновления 2.

ли кто-нибудь есть решение этой проблемы?

ответ

1

Я думал, что это может быть новое предупреждение, но нет - it was earlier just turned off by default. Я полагаю, что это давняя «проблема», однако было бы не так просто преобразовать ее в реальную ошибку (если это вообще возможно и имеет побочные эффекты).

Проблема связана с картой точек подключения, используя статическую локальную переменную _entries внутренне, которая инициализируется при первом использовании в потокобезопасном режиме. Это, однако, инициализация указателя с фиксированными значениями, на которые ссылается указатель. Возможно, проблема состоит в том, что поток # 1 рассматривает карту как инициализированную, а поток # 2 находится только в середине инициализации. Довольно редкое состояние, неудивительно, что до сих пор не было никаких жалоб.

Решение может быть в окружающих статической инициализации переменных с глобальной блокировки критической секции, такие как

ATLASSERT(_pAtlModule); 
CComCritSecLock<CComCriticalSection> Lock(_pAtlModule->m_csStaticDataInitAndTypeInfo); 
static ... 

в карте макросов, и подавление предупреждения с помощью #pragma. Это должно быть исправление в коде заголовков ATL (atlcom.h).

+0

Спасибо @ roman-r, я отключил его с предупреждением #pragma (disable: 4640) в stdafx.h. По какой-то причине он работал только для файлов заголовков, включенных непосредственно в stdafx.h, но это еще одна проблема. –

+1

https://connect.microsoft.com/VisualStudio/feedback/details/2539759/c4640-warning-cannot-be-disabled – thims