2个进程通信,进程A使用300个线程循环向进程B的一个线程发送数据,如何保证不丢失数据?
情况大概如下
进程A:进程A的数据存储空间//这里的数据,我使用了listfor (int i = 0 ; i<300 ; i++)
{
   CreateThread(0,0,FunThread1,0,0.....);
   CreateThread(0,0,FunThread2,0,0.....);
}FunThread1(LPVOID p)
{
  while(1)
  {
       向进程A的数据存储空间写入数据
  }
}FunThread2(LPVOID p)
{
  while(1)
  {
       程A的数据存储空间的数据 发向进程B。
  }
}进程B
void ReceiveBuffer()
{
    保存进程A的数据
}

解决方案 »

  1.   

    发、收双方需要同步控制。同时接收方需要一个足够的buffer进行缓冲数据,否则很难保证不丢失数据,甚至说运行下去不出问题。进程的同步控制应该不成问题,但是具体的方案就要详细研究了,期待楼下解答。
      

  2.   

    只要你这里要处理同步,比如你的发送线程将数据存入公共的缓冲区中,然后就可以通知接受线程来取数据了,同时还要考虑当公共的缓冲区满了,那么发送线程就不能再往其中放数据的问题,你可以考虑使用Semaphore信号量机制
      

  3.   

    同步控制的目的就是要解决一系列问题,当然包括死锁等基本问题。你这里要解决的不单单是个同步问题,是一个方案问题。你这个事情不是一个简单的小问题,而是一个系统的设计问题。比如收发双方的数据处理机制、缓冲机制、同步机制(收发的速度控制、数据一致性控制)等。你首先要解决:
    1、发送发 -- 如何发送?
    2、如何进程间通信
    3、如何缓冲(收、发)
    4、同步控制(信号量、Event ...?),包括缓冲内存的大小、访问控制、数据满处理等
    5、接收方 -- 如何接收?
      

  4.   

    哈,不明白LZ为什么用300个线程同时向B发,这样是想提高效率,还是想让自己陷入麻烦。
    我的思路是做一个服务线程和一个命令队列,只要队列不空就向B发送。我觉得A向B发送的话一个线程就足够了,当然,如果B里有多个线程接收的话,可以用多个发。
      

  5.   

    哦,压力测试。那B应该是个服务器了。以前用java写过这个,在服务器里有个命令队列,如果命令数达到配置的值就认为服务器已满负栽,拒绝新的请求。
    顺便问一下,你的测试结果如何了?