首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

CnComm多线程串口通信类解读

2013-11-03 
CnComm多线程串口通讯类解读CnComm是llbird开发的WINDOWS/WINCE 多线程串口通讯开源库,使用C (ANSI/UNICOD

CnComm多线程串口通讯类解读

      CnComm是llbird开发的WINDOWS/WINCE 多线程串口通讯开源库,使用C++ (ANSI/UNICODE)开发,支持的平台包括WINDOWS(WIN98/NT/2000/XP/2003/Vista),WINCE 5.0 模拟器, Pocket PC 2003 模拟器,在BC++ 5(free tool); C++ BUILDER 4, 5, 6, X;EVC 4(sp4); G++ 3, 4; Intel C++ 7, 8, 9; VC++ 6(sp6), .NET, 2003, 2005等编译工具下编译测试通过,代码采用传统C++的继承机制, 采用VC命名风格(匈牙利),提供同步IO并发访问的支持,内存管理采用内存池技术,提供对于C++异常的支持,对于串口库的扩展,不推荐直接在本代码上修改, 应通过C++继承扩展机制扩展本代码。

       CnComm多线程串口类的类结构如下,CnComm是定义的多线程串口类,CnComm::BlockBuffer类是根据通讯特点开发的缓冲区类,单向链表内存块,提供一些扩展以支持和API挂接,CnComm::InnerLock是自动锁类,用于函数内部,利用对象的生命周期完成锁定及解锁,CnComm::MfcException是一个异常处理类,用于MFC的异常处理,CnComm::BlockBuffer::Block是定义的缓冲区内存块,CnComm::BlockBuffer::InnerLock是定义的自动锁类,CnComm::BlockBuffer::Iterator是定义的缓冲区迭代器。在这个多线程的串口类中,定义了多个嵌套类。

       现代C++使用RAII的机制,使用类来管理资源,在构造函数中分配资源,在析构函数中释放资源,这种方法管理资源基本上不会遇到什么问题,然而,动态内存的管理,一直就是一个烫手的山芋, C/C++提供了多种方式,C中的malloc/free,C++中的new/delete以及new[]/delete[],全局的::operator new和::operator delete,C++标准库中提供的allocator::allocate和allocator::deallocate,以及内存池的技术。

      如果出现在多线程的情况下,并发访问的出现,还不止要解决好内存泄露方面的问题,对于多线程的race condition同样棘手,你必须考虑各种并发问题:如果在一个线程读取某个数据结构的同时,另一个线程正在更新同一个数据结构,除非你用适当的锁或无锁算法保护这个数据结构,保证适当的序列化操作,否则就会发生严重的混乱。通常我们通过加锁来避免对于数据的破坏,或者设计精妙的锁无关算法。在CnComm多线程的串口类中,作者使用内存池技术来管理内存块,利用锁结构来实现对于并发访问的控制。

 

1.单向链表内存块

       在运行过程中,BlockBuffer内存池可能会有多个用来满足内存申请请求的内存块,这些内存块是从进程堆中开辟的一个较大的连续内存区域,它由一个Block结构体和可供分配的内存单元组成,所有内存块组成了一个内存块链表,BlockBuffer的头指针F_是这个链表的头,尾指针L_指向最后一个分配的Block内存块。对每个内存块,都可以通过其头部的Block结构体的N_成员访问紧跟在其后面的那个内存块。

CnComm多线程串口通信类解读

源码如下:


代码如下:

DWORD SafeWrite(LPCVOID lpBuf, DWORD dwSize){         InnerLock lock(this); return Write(lpBuf, dwSize);}


热点排行