以信号量共享内存方式做进程间通信时,第二次信号写内存太快导致前一次通讯数据被覆盖而遗漏的有关问题
以信号量共享内存方式做进程间通信时,第二次信号写内存太快导致前一次通讯数据被覆盖而遗漏的问题!
Windows进程间通信问题请教:
在使用信号量共享内存在进程间传递数据的过程中,遇到这样的问题:若下一次新数据在共享内存中的更新速度太快,比如在第一次写内存后的几乎同时,就立即写第二次更新的数据,它会导致子进程不能读到第一次的数据,而只能读到第二次的数据。
大家有什么可行的方法来解决这个问题?我了解在Unix中可以使用消息队列,但在VS中,有没有这样类似的成熟机制来实现?谢谢各路高手!
此问题的关联问题:通过LPVOID传递结构对象之后,还原结构体各参数显示混乱或传递失败的问题!(http://bbs.csdn.net/topics/390943627)
------解决思路----------------------
http://download.csdn.net/detail/henry3695/2503361
看下这个例子,这个是进程间数据发送成功了,才会发下一条数据
稳稳的
------解决思路----------------------
共享内存里做一个环形队列的数据结构,用进程共享锁/信号量做同步。
------解决思路----------------------
优先使用socket。
------解决思路----------------------
共享内存里做一个环形队列的数据结构,用进程共享锁/信号量做同步。
------解决思路----------------------
使用两个信号量,接受方读完数据后才允许发送方写入数据。
另外windows上的话,使用命名管道会方便很多。
------解决思路----------------------
很多种实现的方式,主要是对流程没有搞清楚才导致出现这种现象的
------解决思路----------------------
仅供参考:
Windows进程间通信问题请教:
在使用信号量共享内存在进程间传递数据的过程中,遇到这样的问题:若下一次新数据在共享内存中的更新速度太快,比如在第一次写内存后的几乎同时,就立即写第二次更新的数据,它会导致子进程不能读到第一次的数据,而只能读到第二次的数据。
大家有什么可行的方法来解决这个问题?我了解在Unix中可以使用消息队列,但在VS中,有没有这样类似的成熟机制来实现?谢谢各路高手!
此问题的关联问题:通过LPVOID传递结构对象之后,还原结构体各参数显示混乱或传递失败的问题!(http://bbs.csdn.net/topics/390943627)
------解决思路----------------------
http://download.csdn.net/detail/henry3695/2503361
看下这个例子,这个是进程间数据发送成功了,才会发下一条数据
稳稳的
------解决思路----------------------
共享内存里做一个环形队列的数据结构,用进程共享锁/信号量做同步。
------解决思路----------------------
优先使用socket。
------解决思路----------------------
共享内存里做一个环形队列的数据结构,用进程共享锁/信号量做同步。
------解决思路----------------------
使用两个信号量,接受方读完数据后才允许发送方写入数据。
另外windows上的话,使用命名管道会方便很多。
------解决思路----------------------
很多种实现的方式,主要是对流程没有搞清楚才导致出现这种现象的
------解决思路----------------------
仅供参考:
struct ReqDataStruct
{
char Client;
char Flag;
int RequestID;
double Weight;
} ReqDatas[5];
struct signal_message
{
int front;
int rear;
int count;
} sm;
int put(struct ReqDataStruct *pRD) {
int r;
r=0;
lock
if (sm.count>=5) {//Full
r=1;
} else {
ReqDatas[sm.front]=*pRD;
sm.front++;sm.front%=5;
sm.count++;
}
unlock
return r;
}
struct ReqDataStruct *get() {
struct ReqDataStruct *r;
static struct ReqDataStruct rd;
lock
if (sm.count<=0) {//Empty
r=NULL;
} else {
rd=ReqDatas[sm.rear];
r=&rd;
sm.rear++;sm.rear%=5;
sm.count--;
}
unlock
return r;
}
void init() {
sm.front=0;
sm.rear=0;
sm.count=0;
}