두 개의 프로세스가 있으며, 메모리 매핑 된 파일과 이벤트라는 이름을 사용하여 서로 이야기하고 있습니다. 초기화 코드는 두 프로세스에서 동일합니다. 오류 처리는 여기에 표시되지 않지만 모든 반환 값을 확인합니다.공유 메모리가 업데이트되지 않았습니다.
HANDLE m_hFileMapping;
LPVOID m_pViewOfFile;
int* m_pDataPtr;
HANDLE m_hEventDone;
m_hFileMapping = CreateFileMapping(
INVALID_HANDLE_VALUE, // system paging file
NULL, // security attributes
PAGE_READWRITE, // protection
0, // high-order DWORD of size
MEMORY_MAPPED_FILE_SIZE, // low-order DWORD of size (4096)
MEMORY_MAPPED_FILE_NAME); // name (the same for both processes)
m_pViewOfFile = MapViewOfFile(
m_hFileMapping, // handle to file-mapping object
FILE_MAP_ALL_ACCESS, // desired access
0,
0,
0); // map all file
m_pDataPtr = (int*)m_pViewOfFile;
m_hEventDone = CreateEvent(NULL, FALSE, FALSE, EVENT_NAME_COMMAND_DONE); // the same name in both processes
서버 프로세스 업데이트 공유 메모리와 세트 이벤트 :
*m_pDataPtr = some_value;
SetEvent(m_hEventDone);
클라이언트 프로세스가 m_hEventDone
기다립니다. 이벤트가 설정되면, 그것은 메모리를 읽
if (WaitForSingleObject(m_hEventDone, TIMEOUT_INTERVAL) != WAIT_OBJECT_0)
{
// handle error and return
}
int result = *m_pDataPtr;
때로는 클라이언트 프로세스가 m_pDataPtr
에서 오래 된 (이전) 값을 읽습니다. 다음 반복에서는 업데이트 된 값을 읽을 수 있습니다. 두 프로그램 모두 디버그 구성에 있으며 최적화는 없습니다. Windows 7 멀티 코어 컴퓨터에서 실행됩니다. 읽기/쓰기 트랜잭션은 사용자 명령에 의해 시작되고 직렬화되기 때문에 공유 메모리에 대한 액세스는 동기화되지 않습니다.
이 프로그램을 어떻게 변경하여 클라이언트 측에서 최신 업데이트 값을 얻을 수 있습니까?
volatile은 컴파일러가 변수 값을 캐시하거나 캐시에서 읽는 것을 방지합니다. 대신 값은 메모리에서 읽습니다. – IInspectable
@IInspectable : 포인터를 volatile로 정의하면 문제가 해결됩니다. 대답을이 글에 게시하면 받아 들일 것입니다. –