如何确保一次只有一个进程访问共享内存
How to ensure only one process accesses shared memory at a time
我对Win32编程相当陌生。我想在两个进程之间创建一个共享内存。我已经使用内存映射功能创建了共享内存。
我的结构看起来像这样:
struct sharedMemory
{
int ans1;
int ans2;
BOOLEAN flag1;
};
现在我能够从不同的进程访问这个共享内存,但我对如何对这个共享内存应用锁定感到困惑,以便只有一个进程能够访问结构成员变量。
通过在调用 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;
}
我知道以上不是很标准,也不是很完美。但这只是一种在不使用互斥锁的情况下可以手动管理线程的方法。只是一个想法/建议
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- 如果我们有一个基*类,如何访问派生模板类的成员函数
- 我有一个 Qt 对象的 2d 数组,我已经用值播种了这些对象。如何访问数组中特定对象的值并更改它们?
- 我可以有一个与另一个向量共享存储的向量
- 长镜头 -- 可能有一个静态类成员,该类成员具有访问非静态成员的 lambda
- clang,linux是否有一个选项可以在链接时更改共享库名称
- 如何确保一次只有一个进程访问共享内存
- c++是否有一个默认的数据类,用于以合理的速度对基于索引的访问进行排序
- 给一个c++类foo,里面有一个同步方法.如何保证同步方法只能被一个线程访问
- 如果多个类有一个共同的静态变量,它们是共享的吗(在同一个作用域内?)
- 我有一个类的数组,我想访问它的元素
- 为什么代码需要有一个可访问的复制/移动构造函数,即使允许发生复制-省略
- 我有一个基对象和派生类对象的向量,但我无法访问存储在向量中的派生对象继承的数据成员
- 任何人都有一个很好的C++共享内存容器