在这个实例中,我专门用了一个类来实现数据的同步,叫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();