nanomsg笔记--stl跨平台的实现

  因为自己没有在实际的场景中用过消息队列,因此长期都比较好奇。这段时间正好有空余时间看一看相关的源码。 在网络上搜索了一圈,加上最近在学习c++,便找到了一个叫做ZeroMQ的项目,听说挺出名的,可惜 没找到地址,不过找到了它的作者用c重构的版本——nanomsg。 于是就开始操作了。

  这个项目蛮大,看了时间跨度在两年多,支持windows与unix系统。 由于我并没有在linux使用过c++,所以对于posix线程与win线程,它们各自系统的异步消息通信区别 ,如何进行迁移不了解。 因此这里便利用这个机会将它们给学习一下:

1.thread库的跨平台支持:

1.1图解:

1.2注释:

     在nanomsg中,通过对thread进行了一层抽象。 即在posix线程标准与 win线程标准的上层进行设计,利用编译时的条件宏,进行平台环境的编译。

     其实现的关键在于: 结构体,亦或者是 抽象的类。

2.消息通道的跨平台支持:

2.1图解:

2.2注释:

   定义了事件传输的介质。 在windows中,通过一对socket套接字进行实现。基于unix的系统,有系统层面的支持。 

3.锁机制的跨平台支持:

3.1图解:

3.2注释:

  之前我一直使用的是 mutex来替换 posix的 pthread_mutex_t。

  mutex的加锁与释放可以是自动的,也可以是手动的;

  临界区则必须要手动的枷锁与释放,我想这是它更适合的原因吧。

4.原子操作的跨平台设计:

4.1图解:

4.2注释:

   原子操作之前在jvm的实现的时候,有一个Unsafe的c++文件,它在java.concurrent包中的某些类初始化的时候会调用。

   windows通过系统api对原子操作进行支持;

   unix则需要通过线程锁机制进行实现;

5.条件变量的跨平台设计:

5.1图解:

5.2注释:

  条件变量之前实现jvm的时候也有遇到,当时是以Even句柄来实现的。它无法与 pthread_cond_t比较优雅的衔接;

  实际上mingw是提供了条件变量的api,它内部也是基于Event句柄实现的。

6.多线程编程跨平台设计:

6.1图解:

6.2注释:

   这个跟线程池的设计挺像的,同时这里加入了对timer的的支持。

7.socket的跨平台设计:

7.1图解:

7.2注释:

  win与linux对socket的类型声明不同还只是小事,主要是基于各自的消息机制不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章