最近想封装一下WsaEventSelect模型来方便编程,有个大概的想法,不知道有没有问题
class MyClass
{
  public :
  void Init(....);
  void Open(....);
  virtual OnListen(...);
  virtual OnRead(...);
  Virtual OnWrite(....);
  Virtual OnError(....);private:
 ThreadPooc(.....)
 { 
  //启动线程,不停的执行WsaEventSelect ,来获取Socket上的事件
  if(Event==FD_Read)
    {
      SaveToBuffer();//将数据存入缓冲区后
      OnRead();//通知从缓冲区接收到数据
     }。。
}
使用的时候重载OnRead,onWrite函数。现在我想问个问题:在线程中,当事件触发后,线程函数调用类的函数OnAccept,在执行过程中,线程应该是阻塞在哪里的吧,这样是不是就在主线程中执行了呢?就不用考虑临界区问题了呢?

解决方案 »

  1.   

    线程里执行的和主线程是没有什么多大关系的,如果buffer在主线程中,那你的主线程和子线程就公用了这份数据,比如你在线程中SaveToBuffer()时,主线程调用了OnRead()就需要临界区;加入你的主线程中,没有用到OnRead(),而是在子线程中调用的,那就无须临界区了。
      

  2.   

    如果在线程中执行OnRead,那么线程在处理这个函数的时候,就没法处理别的数据了,比如,别的Socket的断开,接受数据有没有一个办法,就是线程先将数据接收下来,然后,通知类的实例,说数据到了(或者别的一些事件),通知完毕后,线程继续循环,等待数据,类的实例接受到通知后,就开始调用OnRead函数,这样似乎性能上要好点。那么,线程如何通知类的实例呢?因为,数据到达或别的事件发生的时候,还有一些参数,比如那个socket触发的事件,触发的什么事件,实际接收到的数据时多少。