我对 Win32 编程相当陌生。我想在两个进程之间创建共享内存。我已经使用内存映射功能创建了共享内存。
我的结构看起来是这样的:
struct sharedMemory
{
int ans1;
int ans2;
BOOLEAN flag1;
};
现在我可以从不同的进程访问这个共享内存,但是我对如何将锁应用到这个共享内存感到困惑,以便只有 1 个进程能够访问 struct 成员变量。
我对 Win32 编程相当陌生。我想在两个进程之间创建共享内存。我已经使用内存映射功能创建了共享内存。
我的结构看起来是这样的:
struct sharedMemory
{
int ans1;
int ans2;
BOOLEAN flag1;
};
现在我可以从不同的进程访问这个共享内存,但是我对如何将锁应用到这个共享内存感到困惑,以便只有 1 个进程能够访问 struct 成员变量。
通过在调用时提供互斥锁名称CreateMutex
,您将使互斥锁对其他进程可见。
如果另一个进程将相同的名称传递给CreateMutex
,它将获得现有的互斥锁(而不是创建一个新的互斥锁),然后可以将其用于进程间同步。
共享内存只是加载在各种程序的地址空间中的内存页面,因此共享内存与进程对其的访问无关。为了在任何操作系统中处理这个问题,包括 Windows 和 Posix,您应该创建自己的同步机制。
为了处理这个你必须采取步骤,一个进程向另一个进程发出数据准备好的信号(在 Win32 中你可以使用命名事件,更多信息请看 CreateEvent ),另一个步骤是通过一些同步机制独占访问共享内存(在 Win32 中,这可以使用命名互斥体来完成,有关更多信息,请参阅 CreateMutex)。
您可以做两件事之一,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;
}
我知道以上不是很标准或完美的。但如果不使用互斥锁,这只是一种手动管理线程的方法。只是一个想法/建议
有点困惑,内存映射文件是线程安全的。许多线程可以通过读和读/写访问访问一个或多个文件视图。
无论如何,您需要一个进程间锁来只允许一个线程接触您的结构(互斥锁)。