该函数为一个对话框实例的OnSave(),内容是把信息保存到本地文件中.如果第二次调用的它的时候,前一次的内容还没有写完,那我想肯定会对文件的操作有冲突.所以我想问的是:vc的机制中,系统是不是会自动安排第二次调用的时候一定会等到第一次调用完成后才会执行?
如果不自动,是不是要我们自己人工来坚决:第二次执行前,先检查并等待,再执行?谢谢!

解决方案 »

  1.   

    会冲突,采用临界区保护
    EnterCriticalSection(xxx)
    OnSave();
    LeaveCriticalSection(xxx);
      

  2.   

    应该是人工来解决。 类似多线程操作一个公共变量的时候要同步......你操作文件是用的fopen ? CFile? CreateFile?我记得CFile::Open和CreateFile可以设置文件是不是共享读写的(FILE_SHARE_WRITE)如果一个没有写完, 另外一个打开文件的时候就会失败嘛!  判断下返回值旧ok了
      

  3.   

    HANDLE CreateFile(
    PCSTR pszFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    PSECURITY_ATTRIBUTES psa,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile);
    CreateFile函数有好几个参数,这里只重点介绍前3个参数,即pszFileName,dwDesiredAccess和dwShareMode。第一个参数pszFileName用于指明要创建或打开的文件的名字(包括一个选项路径),第二个参数dwDesiredAccess用于设定如何访问该文件的内容,第三个参数dwShareMode告诉系统你想如何共享该文件,可以为dwShareMode设定:0 打开文件的任何尝试均将失败 
    FILE_SHARE_READ 使用GENERIC_WRITE打开文件的其他尝试将会失败 
    FILE_SHARE_WRITE 使用GENERIC_READ打开文件的其他尝试将会失败 
    FILE_SHARE_READFILE_SHARE_WRITE 打开文件的其他尝试将会取得成功 
      

  4.   

    除非启用了新的线程,否则不用考虑同步问题(无论多少个实例,在一条流水线上就不会有冲突)多线程环境下,可以使用临界区
    或者WaitForSingleObject(...
    确保线程安全
      

  5.   

    EnterCriticalSection(xxx) 
    OnSave(); 
    LeaveCriticalSection(xxx);这样做最简单,防止OnSave函数重入
      

  6.   

    要看具体是什么样的函数,有些情况会被重复调用,如果该函数只在本进程内被调用,可以通过进入临界区的方式来防止重入,如果该函数可能被多个进程调用,则需要使用命名互斥对象等方式来防止重入。
    从OnSave这个名称来看,应该是消息响应函数,如果在这个函数内部没有执行与消息有关的代码,是不会被重复调用的。