如何确保一次只有一个进程访问共享内存

时间:2012-10-02 21:37:03

标签: c++ visual-c++ win32-process

我是Win32编程的新手。我想在两个进程之间创建一个共享内存。我已经使用Memory Mapping功能创建了共享内存。

我的结构看起来像这样:

struct sharedMemory
{
  int ans1;
  int ans2;
  BOOLEAN flag1;
};

现在我可以从不同的进程访问这个共享内存,但是我对如何将锁应用于这个共享内存感到困惑,这样只有一个进程能够访问结构成员变量。

4 个答案:

答案 0 :(得分:6)

通过在调用CreateMutex时提供互斥锁名称,您可以从其他进程中看到互斥锁。

如果另一个进程将同一名称传递给CreateMutex,它将获取现有的互斥锁(而不是创建一个新的互斥锁),然后可以将其用于进程间同步。

答案 1 :(得分:1)

共享内存只是加载到各种程序的地址空间中的内存页面,因此共享内存与访问进程无关。为了在任何操作系统(包括Windows和Posix)中处理此问题,您应该创建自己的同步机制。

为了处理这个问题,你必须执行步骤,一个进程发出信号另一个数据就绪的进程信号(在Win32中你可以使用命名事件,有关更多信息,请查看CreateEvent),另一步是通过以下方式独占访问共享内存一些同步机制(在Win32中,这可以使用命名的互斥锁来完成,有关更多信息,请参阅CreateMutex)。

答案 2 :(得分:0)

稍有混淆,内存映射文件是线程安全的。许多线程可以通过读取和读取/写入访问来访问一个或多个文件视图。

无论如何,你需要一个进程间锁,只允许一个线程触及你的struct(Mutex)。

答案 3 :(得分:0)

你可以做两件事之一, 1)创建一个互斥锁,并通过互斥锁功能将其锁定(参见MSDN参考) 2)创建或利用布尔值,对于锁定为true(也就是说正在进行一些复制,修改或使用数据),对于解锁则为false(父线程或主线程处理它)。 这样你就可以做到:

int someThread1(threadData *data)
{
    data->lock = true;
    /* Do data functions */
    data->lock = false;
    return 1; //Or whatever you want it to return after checking data
}
int someThread2(threadData *data)
{
    data->lock = true;
    /* Do data functions */
    data->lock = false;
    return 1; //Or whatever you want it to return after checking data
}
void *masterThread(void *data)
{
   ThreadData * t_Data = (ThreadData*)data;
   do
  {
     if(t_Data->lock == false)
     {
       /*Do normal operations */
     }
     else
    {
      Sleep(10); //Give the CPU a break
     //Do whatever else you need
    }
  }while(someCondition == true);
return 0;
}

我知道上面不是很标准,也不完美。但是,如果不使用互斥锁,你只需要手动管理线程。只是一个想法/建议