如何用Socket实现客户端通信模块[3]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 kanghc 的 blog

在这个实例中,我专门用了一个类来实现数据的同步,叫csyncdata。实现的思想是这样的。通信模块只负责数据的解析和分发,不负责数据的处理。当通信模块接收到数据时,经通信模块解析确认为有效数据后,通信模块根据数据类型进行分发,一方面将数据放入到csyncdata实例中的相应链表中(比如,调用insertack)。这时就要进行同步,因为有可能将要访问的链表正在被其它线程访问。另一方面,发送消息给其它线程,通知有新的数据要处理。

其它线程接收到消息后,则要对数据进行处理。此时,首先要从链表中得到相应的数据(比如,getack),此时也要进行同步,因为也可能有其它线程在访问链表。

这样就把数据的同步集中在csyncdata中,由该类集中处理,结构清晰,而且不容易出错。具体的同步过程很简单,如:

// 将回执信息加入列表

void csyncdata::insertack(sack* pack)

{

   csinglelock lock(&m_csack);

   lock.lock();

   if (!lock.islocked()) return;

 

   // 将数据加入列表

   m_acklist.addtail(pack);

   if (m_acklist.getcount() > max_list_count)

      delete m_acklist.removehead();

 

   lock.unlock();

}

 

// 从列表中取出一个到发点信息

sack* csyncdata::getack()

{

   sack* pack = null;

 

   csinglelock lock(&m_csack);

   lock.lock();

   if (!lock.islocked()) return null;

 

   // 将数据从列表中取出

   if (m_acklist.getcount())

      pack = m_acklist.removehead();

本文关键:通信,Socket,多线程
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top