共享内存 - 读写锁

时间:2022-09-04 22:32:40
问题描述:整个项目采用多进程设计,多进程之间采用共享内存进行通信。通信进程会将采集数据更新到共享内存,其它多个进程都需要从共享内存中读取数据。这样的“一个进程写、多个进程读”的模型,需要采用读写锁来提高访问效率。请问大家用过这种进程间的读写锁吗?单个进程内的多个线程的读写锁比较容易,那多个进程如何操作同一个读写锁?类似于互斥量可以有一个名字参数,这样多个进程可以保证操作的是同一个互斥量。

8 个解决方案

#1


http://blog.csdn.net/aka_xingwenpeng/article/details/11671725

#2


引用 1 楼 happyparrot 的回复:
http://blog.csdn.net/aka_xingwenpeng/article/details/11671725


这篇文章看过了,但貌似得到的帮助并不大,没有说明如何实现。

#3


其实你可以改变下思路  专门一个进程(假设进程A)负责管理全局共享变量的访问权限  其他进程对全局共享变量的访问都先通过这个进程A来获取权限然后对全局共享变量进行访问    这样你的多进程读写锁又变回单进程读写锁了...

#4


还是用mutex,可以跨进程,然后就是读写锁的逻辑了

#5


把读写锁的状态信息放到共享内存,然后用一个mutex互斥对这个状态信息区的读写。当拿到对读写锁本身的访问权限后,读出读写锁状态。根据读写锁状态判断当前对于数据的访问是否允许,如果允许修改读写锁状态,放开mutex,然后该对数据区干嘛干嘛。

如果当前状态不允许则麻烦些,放开mutex后等待在事件上,等通知吧,拿到通知后记得还是要重复上述操作直到成功。

#6


共享内存 - 读写锁

#7


第一步:定义函数:
BOOL CShareMem::Lock(DWORD dwMilliSec)
{
if( WaitForSingleObject(m_hMutex,dwMilliSec) == WAIT_OBJECT_0)
return TRUE;
return FALSE;
}
BOOL CShareMem::Unlock(DWORD dwMilliSec)
{
return ReleaseMutex(m_hMutex);
}

第二步:
//创建互斥量
m_hMutex = CreateMutex(NULL,FALSE,csMutexName);
//创建共享内存

第三步:使用
 
    if( MySharedMem.Lock(100) )//加锁
    {
       //读写数据代码
       MySharedMem.Unlock();//解锁
    }

#8


其实用命名的event 或mutex都可以做到,根据名字用openevent或openmutex在其它进程可以打开,不过有时候受到进程优先级影响,可以提高进程权限以可以读取其它进程中的event或mutex.

#1


http://blog.csdn.net/aka_xingwenpeng/article/details/11671725

#2


引用 1 楼 happyparrot 的回复:
http://blog.csdn.net/aka_xingwenpeng/article/details/11671725


这篇文章看过了,但貌似得到的帮助并不大,没有说明如何实现。

#3


其实你可以改变下思路  专门一个进程(假设进程A)负责管理全局共享变量的访问权限  其他进程对全局共享变量的访问都先通过这个进程A来获取权限然后对全局共享变量进行访问    这样你的多进程读写锁又变回单进程读写锁了...

#4


还是用mutex,可以跨进程,然后就是读写锁的逻辑了

#5


把读写锁的状态信息放到共享内存,然后用一个mutex互斥对这个状态信息区的读写。当拿到对读写锁本身的访问权限后,读出读写锁状态。根据读写锁状态判断当前对于数据的访问是否允许,如果允许修改读写锁状态,放开mutex,然后该对数据区干嘛干嘛。

如果当前状态不允许则麻烦些,放开mutex后等待在事件上,等通知吧,拿到通知后记得还是要重复上述操作直到成功。

#6


共享内存 - 读写锁

#7


第一步:定义函数:
BOOL CShareMem::Lock(DWORD dwMilliSec)
{
if( WaitForSingleObject(m_hMutex,dwMilliSec) == WAIT_OBJECT_0)
return TRUE;
return FALSE;
}
BOOL CShareMem::Unlock(DWORD dwMilliSec)
{
return ReleaseMutex(m_hMutex);
}

第二步:
//创建互斥量
m_hMutex = CreateMutex(NULL,FALSE,csMutexName);
//创建共享内存

第三步:使用
 
    if( MySharedMem.Lock(100) )//加锁
    {
       //读写数据代码
       MySharedMem.Unlock();//解锁
    }

#8


其实用命名的event 或mutex都可以做到,根据名字用openevent或openmutex在其它进程可以打开,不过有时候受到进程优先级影响,可以提高进程权限以可以读取其它进程中的event或mutex.