问题是这样的,目前我有三个程序,三块共享内存,每个程序都可以访问这三快共享内存(我现在是在每个程序中用CreateMutex函数声明了一个锁,用CreateFileMapping和MapViewOfFile函数分别定义三个共享内存)当我使用某一块内存时得先调用WaitForSingleObject函数来确定数据的有效性,可是每次调用WaitForSingleObject函数对一块内存进行操作时其他两块也处于锁定状态了,我想每次操作那块就对那块锁定,想请教您这个问题如何解决呀,不知道说明白没有

解决方案 »

  1.   

    就是这个锁和内存是如何对应法,我的代码如下,不知该如何实现一对一的关系
    m_hDataLock = ::CreateMutex(NULL, false, lockname);
    if (INVALID_HANDLE_VALUE == m_hDataLock || m_hDataLock==NULL)
      {
        AfxMessageBox("句柄分配错误", MB_ICONERROR);
        return false;
      }//Creatmem("ShareMem Sample App");
    for(i=1;i<=MAX_BUFF_NUM;i++)
    {
    name[0]='\0';
    name[1]='\0';
    sprintf(name,"%d",i);
    // AfxMessageBox(name);
    m_hFileMapping = ::CreateFileMapping(
    (HANDLE)0xFFFFFFFF,  // File handle
    NULL,                // Security attributes
    PAGE_READWRITE,      // Protection
    0,                   // Size - high 32 bits
         sizeof(struct mem_struct),               // Size - low 32 bits
          
    name); // Name
    if(m_hFileMapping ==NULL)
    {
    return false;
    }

    m_buf[i]= (struct mem_struct *)::MapViewOfFile(
    m_hFileMapping,        // File mapping object
    FILE_MAP_ALL_ACCESS, // Read/Write
    0,                  // Offset - high 32 bits
    0,                  // Offset - low 32 bits
    sizeof(struct mem_struct));                 // Map the whole thing
       }
      

  2.   

    这样就好啦,用数组:
     
    for(i=1;i <=MAX_BUFF_NUM;i++) 

    sprintf(lockname,"lock%d",i); 
    m_hDataLock[i] = ::CreateMutex(NULL, false, lockname[i]); 
    if (INVALID_HANDLE_VALUE == m_hDataLock[i] ¦ ¦ m_hDataLock[i]==NULL) 
      { 
        AfxMessageBox("句柄分配错误", MB_ICONERROR); 
        return false; 
      } name[0]='\0'; 
    name[1]='\0'; 
    sprintf(name,"%d",i); 
    // AfxMessageBox(name); 
    m_hFileMapping[i] = ::CreateFileMapping( 
    (HANDLE)0xFFFFFFFF,  // File handle 
    NULL,                // Security attributes 
    PAGE_READWRITE,      // Protection 
    0,                  // Size - high 32 bits 
        sizeof(struct mem_struct),              // Size - low 32 bits 
          
    name); // Name 
    if(m_hFileMapping[i] ==NULL) 

    return false; 
    } m_buf[i]= (struct mem_struct *)::MapViewOfFile( 
    m_hFileMapping[i],        // File mapping object 
    FILE_MAP_ALL_ACCESS, // Read/Write 
    0,                  // Offset - high 32 bits 
    0,                  // Offset - low 32 bits 
    sizeof(struct mem_struct));                // Map the whole thing 
      
    }