多线程写文件的问题
创建一个简单的mfc dialog对话框程序,添加一个按钮,启动两个线程写同一个文件,关键的代码如下
1、
#define M 1024*1024
void CMultithreadMFCDlg::OnButton1()
{
HANDLE hd1;
HANDLE hd2;
DWORD hdid1;
DWORD hdid2;
hd1 = CreateThread(NULL,0,Fun1,NULL,0,&hdid1);
hd2 = CreateThread(NULL,0,Fun2,NULL,0,&hdid2);
}
DWORD WINAPI Fun1(LPVOID stream)
{
FILE *sstream = fopen("a.txt","a+");
BYTE *tmp = new BYTE[M];
memset(tmp,97,M);
fwrite(tmp,sizeof(char),M,(FILE *)sstream);
return 1;
}
DWORD WINAPI Fun2(LPVOID stream)
{
FILE *sstream = fopen("a.txt","a+");
BYTE *tmp = new BYTE[M];
memset(tmp,98,M);
fwrite(tmp,sizeof(char),M,(FILE *)sstream);
return 1;
}
...
问题是这样操作的时候写的文件大小每次都不同,而且都没有到2m
2、
如果换一种方式,两个线程往同一个file handle里写数据就没有问题
CMultithreadMFCDlg::CMultithreadMFCDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMultithreadMFCDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMultithreadMFCDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
this->m_fStream = fopen("a.txt","a+");
}
void CMultithreadMFCDlg::OnButton1()
{
HANDLE hd1;
HANDLE hd2;
DWORD hdid1;
DWORD hdid2;
hd1 = CreateThread(NULL,0,Fun1,this->m_fStream,0,&hdid1);
hd2 = CreateThread(NULL,0,Fun2,this->m_fStream,0,&hdid2);
}
DWORD WINAPI Fun1(LPVOID stream)
{
BYTE *tmp = new BYTE[M];
memset(tmp,97,M);
fwrite(tmp,sizeof(char),M,(FILE *)stream);
return 1;
}
DWORD WINAPI Fun2(LPVOID stream)
{
BYTE *tmp = new BYTE[M];
memset(tmp,98,M);
fwrite(tmp,sizeof(char),M,(FILE *)stream);
return 1;
}
这样的话每次写文件大小为2m,没有什么错误
这两种方式有什么不同吗?创建两个file object分别操作和创建一个file object操作不同的handle会产生这个差别吗?