多线程写文件线程挂起的问题

来源:百度知道 编辑:UC知道 时间:2024/06/01 06:19:31
HANDLE hFile = CreateFile(szFilePath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
hFile = CreateFile(szFilePath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);
}

LARGE_INTEGER liPos = {0};
DWORD dwByteWrite = 0;

liPos.QuadPart = llfileRecePos;

//SetFilePointerEx(hFile, liPos, NULL, FILE_BEGIN);

Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
Overlapped.Offset = liPos.LowPart;
Overlapped.OffsetHigh = liPos.HighPart;

BOOL nRet = WriteFile(hFile, lpData, dwSize, &dwByteWrite, &Overlapped);
if (!nRet) {
//OutputDebugString(L"enter\n");
WaitForSingleObject(Overlapped.hEvent ,INFINITE);
//OutputDebugString(L"leave\n");
}

GetOverlappedResult(hFile, &Overlapped, &dwByteWrit

“调用线程”是怎么一个概念...

这点代码分析不出太多问题... 不过肯定会出的问题就是你在多个线程里同时对文件的同一个位置写入造成WriteFile返回0,而你又没具体判断是什么错误,依然继续等待操作结束。这个必然会锁死。

另外Event每个线程建一个就够了,不用每次用的时候现建...

---

你这这样解决相当于根本不写那个WaitForSingleObject,就是说这种方法是错的b

你现在应该首先确认WriteFile是不是发生错误了... GetLastError() 用overlapped读写本来也就必须判断WriteFile的last error。

另外其实你写文件用异步干什么b 异步是写慢速设备用的bb

WaitForSingleObject你的调用方式死INFINITE无限等待模式,因为你所等待的事件没有被激活,所以肯定阻塞嘛
你说你这段函数是在线程函数的部分代码,那有问题了,事件一定是全局创建或是能够被所有线程访问到的内存,Overlapped.hEvent 应该是你引用的一个静态变量吧,你这样的写法会让每个线程去创建一次事件而且都往一个地方赋值
WaitForSingleObject 其实就是几个人排队上一个厕所,厕所指示灯只有一个,大家都是看着这个灯进厕所的,不会出现让排队的人给厕所装灯泡