2 개의 스레드를 만들려고합니다. 하나는 매핑 된 메모리 위치에 쓰고 다른 하나는이 위치에서 읽으려고합니다.
지금까지 성공적으로 스레드와 부속 함수를 만들었지 만 가장 주요한 문제는 첫 번째 프로세스가 매핑 된 파일에 쓸 때 오류 값 6을 던져 INVALID_HANDLE_EXCEPTION
을 의미하지만 ' 동일한 방식으로 매핑 된 위치에 쓸 수있는 다른 프로그램을 만들었 기 때문에 왜 그렇게 할 수 있을지 생각해보십시오. 이것은 내 코드이며, 오류가 write_in_mapped
기능 던져 :WinAPI 스레드가 메모리 매핑 된 파일에 쓸 수 없습니다.
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
HANDLE hMutex = CreateMutex(NULL, false, NULL);
int write_in_mapped(HANDLE memoryFile) {
cout << memoryFile << endl;
WaitForSingleObject(hMutex, INFINITE);
string message = "";
for (int i = 0; i < 200; i++) {
int a = rand() % 10000;
int b = a * 2;
message.append(to_string(a)).append(",").append(to_string(b)).append(";");
}
HANDLE mapFile = MapViewOfFile(memoryFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024);
if (mapFile == INVALID_HANDLE_VALUE) {
cout << "Unable to map shared memory 1 - error value:" << GetLastError() << endl;
CloseHandle(memoryFile);
system("pause");
return FALSE;
}
if (size(message)) {
cout << message << endl;
CopyMemory(mapFile, message.c_str(), strlen(message.c_str()) * sizeof(TCHAR));
cout << "Succesfully loaded numbers!" << endl;
}
else {
cout << "Couldn't create numbers!" << endl;
CloseHandle(mapFile);
CloseHandle(memoryFile);
return FALSE;
}
ReleaseMutex(hMutex);
cout << "Done write_to_mapped" << endl;
return 0;
}
int read_from_mapped(TCHAR name[]) {
cout << name << endl;
WaitForSingleObject(hMutex, INFINITE);
HANDLE openFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, name);
if (openFile == INVALID_HANDLE_VALUE) {
cout << "Error at opening mapped memory 2 - error value:" << GetLastError() << endl;
system("pause");
return FALSE;
}
LPTSTR mapFile = (LPTSTR)MapViewOfFile(openFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024);
if (mapFile == NULL) {
cout << "Error at mapping memory 3 file - error value:" << GetLastError() << endl;
CloseHandle(openFile);
system("pause");
return FALSE;
}
string result = string(mapFile).c_str();
cout << result << endl;
ReleaseMutex(hMutex);
return 0;
}
int main() {
HANDLE process_1, process_2, memoryFile;
TCHAR name[] = TEXT("Global\\MyFileMappingObject");
memoryFile = CreateFileMapping(0, 0, PAGE_READWRITE, 0, 1024, name);
if (memoryFile == INVALID_HANDLE_VALUE) {
cout << "Error at opening mapped memory area - " << GetLastError() << endl;
system("pause");
return FALSE;
}
process_1 = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)write_in_mapped, &memoryFile, NULL, NULL);
WaitForSingleObject(process_1, INFINITE);
process_2 = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)read_from_mapped, &name, NULL, NULL);
WaitForSingleObject(process_2, INFINITE);
CloseHandle(memoryFile);
CloseHandle(hMutex);
system("pause");
return 0;
}
에 더있다 : 당신이 CreateThread''로 통화에서 스레드 루틴에 대한 캐스팅을해야하는 경우, 당신은을 사용하는 잘못된 함수 서명. 이 경우 잘못된 인수를 전달하고 호출 규칙을 놓치고 있습니다. 좀 더 미묘한 버그는'GetLastError()'를 너무 늦게 호출한다는 것입니다. 의미있는 가치를 반환하는 조건에 부딪쳐 ** 즉시 ** 호출해야합니다. STDOUT (스레드의 마지막 오류 값을 설정할 수 있습니다) 작성 후이를 호출하고 있습니다. – IInspectable