CFile Read数据问题

zwhate 2010-08-11 02:05:58
我在两个线程里面频繁的读取同一个文件同一个位置的数据,但是有一个线程90%能够读取正确,其他时候要么乱了,要么位置不对了,读到后面一段数据,不知道有没有人知道原因啊?

//¶ÁÈ¡Ë÷ÒýindexµÄµçÌÝÊý¾Ý
BOOL CLiftPara::ReadLiftDB(int index, LIFT_DATABASE& lift)
{
int iLiftNum = (int)(m_fileLift.GetLength() / sizeof(LIFT_DATABASE));

if (iLiftNum == NULL) //ûÓеçÌÝ×ÊÁÏ£¬¶Á²»µ½£¬²Ù×÷ʧ°Ü
{
return FALSE;
}

if (iLiftNum <= index) //µçÌÝ×ÊÁϲ»×㣬Ë÷Òý²»µ½£¬²Ù×÷ʧ°Ü
{
return FALSE;
}

//EnterCriticalSection
//m_cs.Lock();

EnterCriticalSection(&m_csApi);

m_fileLift.Seek(sizeof(LIFT_DATABASE) * index, CFile::begin);
m_fileLift.Read(&lift, sizeof(LIFT_DATABASE));

LeaveCriticalSection(&m_csApi);
//LeaveCriticalSection
//m_cs.Unlock();

return TRUE;
}

即使我加了临界区保护还是解决不了问题。
...全文
291 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwhate 2010-08-13
  • 打赏
  • 举报
回复
晕,很多人根本不认真看帖啊,我都说了是GetLength()改变了当前指针位置,导致文件位置被重新定位,所以另一个线程再去读的时候就乱了
shexinwei 2010-08-12
  • 打赏
  • 举报
回复
两个线程,使用的是两个文件指针访问文件,应当互不影响。你的读出的内容会错位?
zwhate 2010-08-12
  • 打赏
  • 举报
回复
原来这个家伙也会改变文件当前指针位置啊...
m_fileLift.GetLength()

我把这个也放在临界区内保护起来,好像就不出问题了,但是MSDN上没有说明,我来去google
liuhaifeng1976 2010-08-12
  • 打赏
  • 举报
回复
文件偏移位置不对吧
zjz800800 2010-08-12
  • 打赏
  • 举报
回复
虽然说读文件不需要同步,但是问题如果不好界定就将数据同步后分析,使用临界区、互斥量、事件量、信号量均可。
shexinwei 2010-08-12
  • 打赏
  • 举报
回复
一个文件怎么就不能有两个文件指针?
zwhate 2010-08-12
  • 打赏
  • 举报
回复
一个文件,怎么可能有两个文件指针...
确实是GetLength()函数改变了当前指针位置
zwhate 2010-08-11
  • 打赏
  • 举报
回复
那个不是线程函数,是线程调用的函数
Eleven 2010-08-11
  • 打赏
  • 举报
回复
你上面的写的是线程函数吗?
zgl7903 2010-08-11
  • 打赏
  • 举报
回复
线程里建议不要使用CFile类,我做的多线程里也遇到类似的问题,直接使用API的读写方式就解决了
CReateFile
ReadFile
WriteFile
CloseHandle
zwhate 2010-08-11
  • 打赏
  • 举报
回复
关键是这个过程我只用了读数据,根本还没有去写呢...
写只是在其他地方的按钮里面会操作一下,我目前根本不去写,但是数据乱了就算了,还有数据跑到后面一个段去了,我后来以为位置设置出错了seek的时候把位置写死,结果还会错乱
精锐掷矛手 2010-08-11
  • 打赏
  • 举报
回复
只读取的话不需要加临界区,是否有写操作呢?写操作是否有问题?
mudunke775 2010-08-11
  • 打赏
  • 举报
回复
应该是读取汉字的时候出的问题,截断的时候正好截到了汉字的字符中间,所以出现乱码

16,548

社区成员

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

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

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