8 个解决方案
#1
http://blog.csdn.net/aka_xingwenpeng/article/details/11671725
#2
这篇文章看过了,但貌似得到的帮助并不大,没有说明如何实现。
#3
其实你可以改变下思路 专门一个进程(假设进程A)负责管理全局共享变量的访问权限 其他进程对全局共享变量的访问都先通过这个进程A来获取权限然后对全局共享变量进行访问 这样你的多进程读写锁又变回单进程读写锁了...
#4
还是用mutex,可以跨进程,然后就是读写锁的逻辑了
#5
把读写锁的状态信息放到共享内存,然后用一个mutex互斥对这个状态信息区的读写。当拿到对读写锁本身的访问权限后,读出读写锁状态。根据读写锁状态判断当前对于数据的访问是否允许,如果允许修改读写锁状态,放开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();//解锁
}
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
这篇文章看过了,但貌似得到的帮助并不大,没有说明如何实现。
#3
其实你可以改变下思路 专门一个进程(假设进程A)负责管理全局共享变量的访问权限 其他进程对全局共享变量的访问都先通过这个进程A来获取权限然后对全局共享变量进行访问 这样你的多进程读写锁又变回单进程读写锁了...
#4
还是用mutex,可以跨进程,然后就是读写锁的逻辑了
#5
把读写锁的状态信息放到共享内存,然后用一个mutex互斥对这个状态信息区的读写。当拿到对读写锁本身的访问权限后,读出读写锁状态。根据读写锁状态判断当前对于数据的访问是否允许,如果允许修改读写锁状态,放开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();//解锁
}
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.