Windows con el uso de archivos de memoria asignada compartidos utilizando el enfoque de la memoria compartida de asignación de archivos es relativamente simple bajo las ventanas

  
, aquí está la información de código con notas explicativas. operación de llamada es similar a la de Linux bajo SHM. Esta clase no hace demasiadas pruebas, recepción para hacer preguntas y fallo ~~ :)
 # include < windows.h > # include < cadena > # include < iostream > # include < assert.h > utilizando std :: string, std :: cout; std :: endl; #pragma warning (disable: 4311) shareMemory clase {private: shm_name_u LPWSTR; bool is_create_file; void * sh_base; MANIPULAR semáforo; MANIPULAR file_mapping; int addr_len; pública : /* mapa CREATE_FILE se utiliza para ilustrar el uso de archivo de disco o la asignación del archivo de página, si el mapeo con un archivo de disco, memoria compartida no aparece después de la memoria de liberación problema de acceso violación, pero creará un archivo en el disco, por el nombre del archivo shm_name parámetros dados. Si la asignación de archivo de página no esté establecido en un archivo de disco * /shareMemory (const string &shm_name, bool CREATE_FILE = false): is_create_file (CREATE_FILE) {const char * _c_shm_name = shm_name.c_str (); int _size = ( int) shm_name.length () + 1; shm_name_u = (LPWSTR) malloc (_size * 2); MultiByteToWideChar (CP_ACP, 0, _c_shm_name, _size, shm_name_u, _size); semáforo = CreateSemaphore (NULL, 1,1, NULL); sh_base = NULL; file_mapping = INVALID_HANDLE_VALUE;} void * shm_open (void * addr, int longitud const, DWORD a proteger) {addr_len = longitud; MANIPULAR _file_handle = INVALID_HANDLE_VALUE; si (is_create_file) {_file_handle = CreateFile (shm_name_u, GENERIC_READ |
 GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); #ifdef _DEBUG si (_file_handle == INVALID_HANDLE_VALUE) cout < < " !! No se puede crear el archivo que utilizamos archivo de página en lugar "; #endif //fin _DEBUG} /* abrir el archivo de asignación del nombre especificado, si no existe, cree un * /file_mapping = OpenFileMapping (PAGE_READWRITE, falso, shm_name_u), si (file_mapping! = null) Goto file_mapping_exist; file_mapping = CreateFileMapping (_file_handle, NULL, PAGE_READWRITE, 0, longitud, shm_name_u); aserción #ifdef _DEBUG (file_mapping); #endif si (file_mapping == NULL) NULL retorno; file_mapping_exist: sh_base = MapViewOfFileEx (file_mapping, proteger, 0,0, longitud, addr); CloseHandle (_file_handle); regreso sh_base;} /* datos de escritura a la memoria compartida, devuelve el número de bytes de datos escritos * /int shm_write (void * dest, void * src, int size) {if return -1 (check_adress (dest)!); int _write_count = (int) sh_base + addr_len - (int) dest; si (_write_count > tamaño) _write_count = tamaño; /* uso semaphor mapa e protección Regional (diferentes hilos de la misma llamada proceso cuando está protegido) * /WaitForSingleObject (semáforo, infinito); memcpy (dest, src, _write_count); ReleaseSemaphore (semáforo, 1, NULL); FlushViewOfFile (sh_base, _write_count ); _write_count retorno;} /* leer datos de la memoria compartida, devolver el número de bytes de datos leídos ** /int shm_read (! void * src, void * dest, int size) {if (check_adress (src)) volver -1; int _read_count = (int) sh_base + addr_len - (int) src; si (_read_count > tamaño) _read_count = tamaño; memcpy (dest, src, _read_count); _read_count retorno;} ~ shareMemory () {UnmapViewOfFile (sh_base ); libre (shm_name_u); CloseHandle (semáforo); CloseHandle (file_mapping);} privada: /* para la detección de direcciones * /bool check_adress (void * addr) {if (((int) dir < (int) sh_base) |
 |
  ((Int) dir > (int) sh_base + addr_len)) {SetLastError (ERROR_ACCESS_DENIED); printf #ifdef _DEBUG (" denegado el acceso, la dirección de destino fuera de la vista del mapa "!); #endif //_ retorno de depuración false;} return true;}}; 

prueba: el proceso de escritura principal función:

 int main () {sm shareMemory (" impulso ", false); void * bs = sm.shm_open ( NULL, 1000 * 4, FILE_MAP_WRITE), si (BS == NULL) return -1; int a [10]; for (int i = 0; i < 10; ++ i) a [i] = i; sm. shm_write (s a, a, 10 * 4); Sleep (100000);} proceso de lectura principal función: 



 int () {sm principal shareMemory (" " impulso; , false); void * bs = sm.shm_open (NULL, 1000, FILE_MAP_READ), si (BS == NULL) {cout < < " nulo "; regreso -1;} int b [10]; sm.shm_read (s a, b, 10 * 4); for (int i = 0; i < 10; ++ i) cout < < b [i] < < " ";}
						
Copyright © Conocimiento de Windows All Rights Reserved