Нет ничего плохого в использовании #include в заголовочном файле. Это очень распространенная практика, вы не хотите обременять пользователя библиотекой запоминанием того, какие другие неясные заголовки нужны.
Стандартным примером является #include <vector>
. Получает вам векторный класс. И множество внутренних файлов заголовков CRT, которые необходимы для правильной компиляции векторного класса, вещи, которые вам действительно не нужны или о которых вы не хотите знать.
From MSDN :
...
API с блокировкой
Функции с блокировкой обеспечивают простой механизм синхронизации доступ к переменной, которая используется несколько потоков. Они также исполняют операции над переменными в атомарном манера. Нити разных процессы могут использовать эти функции, если переменная находится в разделяемой памяти.
Так что да, это безопасно с вашим подходом к разделяемой памяти.
Связанные функции предназначены именно для этого типа использования.
Из http://msdn.microsoft.com/en-us/library/ms684122.aspx :
Потоки различных процессов могут использовать эти функции, если переменная находится в общей памяти.
Конечно, если вам нужно обновлять более одного элемента атомарно, вам понадобится мьютекс или какой-либо другой объект синхронизации, который работает между процессами. В механизме общей памяти нет ничего встроенного, чтобы обеспечить синхронизацию доступа к общей памяти - вам нужно будет использовать взаимосвязанные функции или объект синхронизации.