2016-11-13 1 views
0

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; 
} 
+0

에 더있다 : 당신이 CreateThread''로 통화에서 스레드 루틴에 대한 캐스팅을해야하는 경우, 당신은을 사용하는 잘못된 함수 서명. 이 경우 잘못된 인수를 전달하고 호출 규칙을 놓치고 있습니다. 좀 더 미묘한 버그는'GetLastError()'를 너무 늦게 호출한다는 것입니다. 의미있는 가치를 반환하는 조건에 부딪쳐 ** 즉시 ** 호출해야합니다. STDOUT (스레드의 마지막 오류 값을 설정할 수 있습니다) 작성 후이를 호출하고 있습니다. – IInspectable

답변

2

코드 실수의 놀라운 번호를 포함. 모든 코드 하나 큰 실수. CreateFileMappingOpenFileMapping은 오류시 0을 반환하지만 INVALID_HANDLE_VALUE은 반환하지 않습니다. &memoryFile&nameCreateThread? 그래서 및 CloseHandle HANDLE mapFile = MapViewOfFileINVALID_HANDLE_EXCEPTION있어 - - 그러나 당신이 사용 &memoryFile 때문에 write_in_mapped에서 잘못된 핸들을 가지고, 그래서 2 시간 가까이 memoryFile 시도 - & 없이 memoryFilename을 필요로 할 때 당신은 int write_in_mapped(HANDLE memoryFile)에서 CloseHandle(memoryFile);int main()에서 호출이 무엇입니까?!? 등등, 등등이 질문에 대해 설명하는 오류 게다가

악몽

+0

사실, 우리는'Thread' 매개 변수에 대해 옳았습니다. 그러나 다음에 여러분의 대답을 조금 더 이해하기 쉽게 만듭니다. – Justplayit94

관련 문제