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的類型聲明不同還只是小事,主要是基於各自的消息機制不同。

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