2014-04-15 6 views
1

3 초 동안 스레드에 "1"을 써야하는 프로그램을 작성했습니다. 그러나 컨트롤 출력을 디버깅하거나 추가하려고하면 스레드가 종종 생성되지 않는다는 것을 알게됩니다 (콘솔 또는 디버그 지점의 업적 없음). 반환 값 CreateThread()을 확인하면 괜찮습니다. I/O 용 파일에 대한 로그를 읽었지만 필요 없다고 생각합니다. 두 개의 스레드가있는 프로그램이 필요합니다. 하나는 3 초 동안 "1"을 쓰고, 두 번째 것은 3 초 동안 "2"를 쓰는 것입니다. 그런 다음 결과를 비교하십시오. 입력 파일에 "1"과 "2"가 섞여 있으면 문제가되지 않습니다.스레드로 파일에 쓰십시오, C++

#include <iostream> 
#include <fstream> 
#include <windows.h> 
#include <stdio.h> 
#include <WinBase.h> 
#include <ctime> 

#define NTHREAD 2 

std::ofstream myfile; 

DWORD WINAPI fce1 (LPVOID a){ 
    time_t timerStart, timerNow; 
    time(&timerStart); 
    timerNow = timerStart; 
    while((timerNow - timerStart) < 3) 
    { 
     myfile << "1"; 
     myfile.flush(); 
     time(&timerNow); 
    } 
    return 0; 
} 


int main() 
{ 
    HANDLE threads[NTHREAD]; 
    DWORD dwThreads[NTHREAD]; 

    myfile.open("file.txt"); 
    threads[0] = CreateThread(NULL, 0, fce1, NULL, 0, &dwThreads[0]); 
    if (threads[0] == NULL){ 
     printf("Error\n"); 
    } 

    myfile.close(); 
    return 0; 
} 

답변

5

문제는 메인 프로그램이 스레드가이 과정을 살해됩니다 폐쇄 파일 에 쓰기를 시도 할 수 있음을 의미한다, 파일 및 스레드 실행이 완료되기 전에 종료를 닫이다 .

프로세스를 종료하기 전에 스레드가 완료 될 때까지 기다려야합니다. 예를 들어 GetExitCodeThread을 사용하여 스레드가 종료되었을 때를 폴링하여이를 수행 할 수 있습니다.

+2

대신 ['WaitForSingleObject'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx)를 사용하는 것이 더 좋지 않을까요? 'GetExitCodeThread'로 폴링합니까? –

+0

@MichaelWalz 물론 그렇습니다. 저는 오랫동안 WIN32를 사용하지 않았기 때문에 더 이상 모든 기능을 기억하지 못했습니다. –

+0

예 ... Java와 C++의 중요한 차이점이 있습니다. C++에서는 주 스레드가 특별합니다! 프로세스가 종료되면 전체 프로세스가 다른 모든 스레드와 함께 종료됩니다 (다른 모든 생성 된 스레드는 단지 DaemonThread입니다) – Falco