因爲自己沒有在實際的場景中用過消息隊列,因此長期都比較好奇。這段時間正好有空餘時間看一看相關的源碼。 在網絡上搜索了一圈,加上最近在學習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的類型聲明不同還只是小事,主要是基於各自的消息機制不同。