多线程对同一个文件句柄读写需要加锁木有??

hurryboylqs 2012-09-23 05:03:36
我觉得不用,因为我是这么实现读写的:


UINT32 CBaseFile::Read(UINT64 Offset, UINT32 dwReadSize, char *pBuffer)
{
//CBaseCriticalSectionLocker lock(&m_RWLock);

UINT32 dwStatus = 0;
UINT32 dwReadBytes = 0;
OVERLAPPED ol = {0};
LARGE_INTEGER FileOffset = {0};
FileOffset.QuadPart = Offset;

ol.hEvent = NULL;
ol.Offset = FileOffset.LowPart;
ol.OffsetHigh = FileOffset.HighPart;
if (!ReadFile(m_hFile, pBuffer, dwReadSize, (LPDWORD)&dwReadBytes, &ol))
{
dwStatus = GetLastError();
}
else
{
if( dwReadBytes != dwReadSize )
{
dwStatus = ERROR_END_OF_MEDIA ;
}
}


return dwStatus;
}

UINT32 CBaseFile::Write(UINT64 Offset, UINT32 dwWriteSize, const char *pBuffer)
{
//CBaseCriticalSectionLocker lock(&m_RWLock);
UINT32 dwStatus = 0;
LARGE_INTEGER FileOffset = {0};
UINT32 dwWriteBytes = 0;

OVERLAPPED ol = {0};
FileOffset.QuadPart = Offset;

ol.hEvent = NULL;
ol.Offset = FileOffset.LowPart;
ol.OffsetHigh = FileOffset.HighPart;

if (!WriteFile(m_hFile, pBuffer, dwWriteSize, (LPDWORD)&dwWriteBytes, &ol))
{
dwStatus = GetLastError();
}
else
{
if (dwWriteSize != dwWriteBytes)
{
dwStatus = ERROR_END_OF_MEDIA ;
}
}


return dwStatus;
}


请问注释掉的哪行可以去掉吗?我担心多线程操作之后读写不是我读写的偏移
...全文
639 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyjzljly 2014-06-23
  • 打赏
  • 举报
回复
不加锁会写脏的,我遇到了
lgstudyvc 2012-09-25
  • 打赏
  • 举报
回复
确保你所读的偏移地址里是你想要的值么?还是读什么都无所谓,只读哪个偏移值内的东东?(这是干哈啊)

加锁是需要的!
hurryboylqs 2012-09-25
  • 打赏
  • 举报
回复
楼上两位可能不明白我的意思,我的意思是我在参数指定好要读的偏移了,因为多线程的关系,到了底层偏移
其实就是一个共用的文件指针,我是担心多个线程同时Read的时候,因为Handle是共用的,导致读到的不是自己的那个偏移,至于偏移里面数据被写入过后是否脏掉这个不用管,我现在只要确保读的是我的那个偏移即可,好像描述的不是很清晰。
傻X 2012-09-25
  • 打赏
  • 举报
回复
我之前程序都没加,没出过事情的。楼主自己try catch写写好。。死不了人的
傻X 2012-09-25
  • 打赏
  • 举报
回复
只要你写的位置不同。

绝对不要加锁

加了锁,多线程体现不了优势了。
lijianli9 2012-09-25
  • 打赏
  • 举报
回复
而且你这个是异步提交更容易出问题
lijianli9 2012-09-25
  • 打赏
  • 举报
回复
必须锁。如果你写的是你读取的位移offest前面的,就会出现读取混乱的为问题。
如果位移以后的,可能就是你要的。
hurryboylqs 2012-09-24
  • 打赏
  • 举报
回复
没人回答了?再过几天没人回答的话就结贴了,我现在不锁,用很久了没发现什么问题
hurryboylqs 2012-09-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

写的可以lock一段内存的。
[/Quote]

我现在只担心我传递的偏移进去由于多线程的关系,导致内部移动文件指针而实际读到不是我想要的那个偏移
,我不需要去锁定什么内存的,就是说写入偏移比如1204,长度是4K,那么最终不管多少个线程同时操作这个m_hFile,都能保证每个操作写入的是自己的位置,而不是写偏到其他地方去了。
足球中国 2012-09-23
  • 打赏
  • 举报
回复
写的可以lock一段内存的。
healer_kx 2012-09-23
  • 打赏
  • 举报
回复
Mark,真的不确定。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧