2012-04-24 73 views
1

当我试图在多线程中打开单独的txt文件时,我遇到了一个问题,即每个线程打开一个txt文件并读取内容,代码是如下。文件在C多线程程序中的输入输出(windows)

#include<stdlib.h> 
#include<windows.h> 
#include<process.h> 

DWORD WINAPI lookup1(LPVOID lpParamter){ 
char x[10]; 
int y; 
FILE* fin1 = fopen("D:\\1.txt", "r"); 
fscanf(fin1, "%s %d", x, &y); 
printf("%s %d", x, y); 
fclose(fin1); 
return 0; 
} 

DWORD WINAPI lookup2(LPVOID lpParamter){ 
char x[10]; 
int y; 
FILE* fin2 = fopen("D:\\2.txt", "r"); 
fscanf(fin2, "%s %d", x, &y); 
printf("%s %d", x, y); 
fclose(fin2); 
return 0; 
} 


int main(){ 
    CreateThread(NULL, 0, lookup1, NULL, 0, NULL); 
    CreateThread(NULL, 0, lookup2, NULL, 0, NULL); 
    return 0; 
} 

我认为这是一个非常简单的程序,每个线程打开一个单独的文件并从中读取。没有涉及文件共享或其他复杂情况,但是我发现每个线程都没有成功打开该文件,fopen后的其他代码会跳过而没有任何提示信息。当我调试这个程序时,它甚至卡住了fopen或fscanf语句,并且从未恢复(Windows操作系统崩溃)。我不知道为什么,请帮助我,谢谢!

编辑:通过将主函数更改为以下代码,问题得到解决,非常感谢!

int main(){ 
    HANDLE hThread1 = CreateThread(NULL, 0, lookup1, NULL, 0, NULL); 
    HANDLE hThread2 = CreateThread(NULL, 0, lookup2, NULL, 0, NULL); 

    WaitForSingleObject(hThread1, INFINITE); 
    WaitForSingleObject(hThread2, INFINITE); 

    CloseHandle(hThread1); 
    CloseHandle(hThread2); 
    return 0; 
} 

回答

2

该应用程序会产生两个线程,然后在线程有机会做任何事情之前退出。 CreateThread返回HANDLE。这些手柄是可以传递给WaitForSingleObject的等待对象。

+0

对不起,但我是多线程编程的新手,你能不能更清楚一点?谢谢! – Bloodmoon 2012-04-24 02:47:13

+1

main,'return 0;'的最后一行退出程序_before_两个后台线程已完成。你需要等待你的两个线程先完成。因此,尝试将'CreateThread'返回的'HANDLE'保存到一个变量中,然后将它传递给'WaitForSingleObject'。在返回之前为_each_线程执行此操作。如果您仍然遇到问题,可以编辑您的问题以显示新代码。 – Useless 2012-04-24 10:44:08

+0

..或者只是'sleep(无限)';'或'真(true)睡眠(1万)';' – 2012-04-24 11:13:20