我有N个线程,每个线程中都有一个缓冲区,一个临界区对象
TSendThread = class(TThread)
public
  ThreadBuffer: array [0..ABSize - 1] of TUDPPacket;  //缓冲区
  FLock: TRTLCriticalSection;
end;SendThreadArray: array[0..N - 1] of TSendThread;主要操作有两个:
一、另一个线程TRecvThread主要负责接包处理
当接到包后,就会在N个线程的缓冲区中查找空闲位置,只要找到一个,就会把该线程的空闲位置设置下状态(有包);
二、另外接到的包,如果是确认包,还要在TSendThread线程的缓冲区中找到该块,并对其进行状态确认。请问。这些操作怎么写互斥呢?我写的,经过测试发现,当我的缓冲区中的每一个包都占满后就不会在发包了,也就是TSendThread中缓冲区的状态全是“有包”,从外面的接收线程中收到了包后,都没有被确认,TSendThread中缓冲区所有的空间都是“有包”状态。请问,上述两个操作的临界区代码怎么写呢。分不够可以再加,希望大家帮下我,急。在线等待。也可以通过QQ与我联系:6286357,验证:CSDN

解决方案 »

  1.   

    感觉用信号量更好,当然,其实道理是一样的TRecvThread 接受到数据,检查各个 TSendThread  的信号,如果是空闲(没信号),则填写其缓冲区(或者将现在数据所在的内存位置告知),然后设置其对应信号;TSendThread 不断检查自己的信号,如果被设置了,则处理自己区的数据,处理完,重新设置回自己的信号;
    如果存在 TSendThread 在处理第二次数据了,才收到第一次的回应,则,要增多一个信号,或者,增多一个状态变量
      

  2.   

    我现在的问题是,接收线程收到确认包后,准备对发送线程TSendThread中的缓冲区中的相应块进行置位时,发现都没有置位成功。我收到确认包后,要查找是哪个块的包,然后在里面进行更新。最后发现没有更新成功。不知道是什么问题。
      

  3.   

    我现在用的是事件,通过WaitForSingleObject函数来等待的。现在的问题是:当线程等待的事件激活后,线程开始运行,如果此时又来了一个激活事件,我的线程由于已在运行,那这个新来的激活事件就不能被保留或让线程执行,因为线程已经在执行了。请问,有什么好的方法可以解决不,我是通过一个标志位来判断线程是否在运行,还处于空闲状态的。
      

  4.   

    在处理和TSendThread相关的资源时都要设置互斥
      

  5.   

    当我的缓冲区中的每一个包都占满后就不会在发包了---------------------------
    满了如何再发包呢?发包之后,你让这个包再那里接收呢?
    方法:
      多开线程来加快处理客户端的请求包,处理完就释放掉线程,再来接收新的请求.当然在此基础上还可以加个接收队列TQueue,来缓存发送请求,在一个线程里面push接收到请求包,在真正处理请求包的线程里面pop出来该请求并加以处理之.