ZThread庫是一個開源的跨平臺高級面向對象的線性和sycnchronization 庫,以運行POSIX 和Win32 系統中的C++程序。 html
ZThread庫的主頁:http://zthread.sourceforge.net linux
最新版本Zthread遠嗎下載地址: http://prdownloads.sourceforge.net/zthread/ZThread-2.3.2.tar.gz 函數
ZThread文檔:http://zthread.sourceforge.net/documentation.html spa
1、在Windows下使用ZThread .net
首先,下載ZThread,解壓到某個目錄下,我解壓到D:\libs\ZThread-2.3.2\中。 指針
方法1:包含源文件直接編譯(不推薦) code
1.在vs2010中,新建一個新的win32 控制檯項目,選擇空項目。 htm
2.在源目錄下新建一個main.cpp文件,在http://zthread.sourceforge.net/html/classZThread_1_1Thread.html 中複製一段示例代碼拷貝到main.cpp中。 對象
3.在項目的配置屬性中,VC++目錄的包含目錄中增長ZThread的頭文件目錄,我這裏是:D:\libs\ZThread-2.3.2\include。配置屬性分DEBUG和RELEASE兩個,默認選擇的是DEBUG配置,但最好兩個都配置一下,不然生成RELEASE版本時會報錯 unicode
4.在項目中新建一個文件夾,名字隨意,個人叫ZThread,而後選擇這個文件夾,右鍵選擇添加->現有項,將ZThread解壓目錄中的src目錄的全部cxx文件都加入到這個目錄中
而後如今能夠編譯了,正常來講,應該編譯經過而且成功啓動程序了。
但也有可能出現一些錯誤:
錯誤一:error C2664: 「GetModuleHandleW」: 不能將參數 1 從「const char [13]」轉換爲「LPCWSTR」
這個是因爲vs2010的項目設置默認採用了unicode字符集致使的,能夠在項目屬性中將字符集改成多字節便可,也能夠在GetModuleHandle函數的字符串參數加上_T()包含,改成GetModuleHandle(_T("Kernel32.dll"));
方法2:編譯成靜態庫
1.在vs2010中,新建一個新的win32 控制檯項目,我取名爲ZThread.,項目類型選擇爲靜態庫。
2.在項目的配置屬性中,VC++目錄的包含目錄中增長ZThread的頭文件目錄,我這裏是:D:\libs\ZThread-2.3.2\include。配置屬性分DEBUG和RELEASE兩個,默認選擇的是DEBUG配置,但最好兩個都配置一下,不然生成RELEASE版本時會報錯
3.在項目源目錄中,右鍵選擇添加->現有項,將ZThread解壓目錄中的src目錄的全部cxx文件都加入到這個目錄中
而後如今能夠編譯了,正常來講,應該編譯經過而且成功生成了ZThread.lib靜態庫。
但也有可能出現一些錯誤:
錯誤一:error C2664: 「GetModuleHandleW」: 不能將參數 1 從「const char [13]」轉換爲「LPCWSTR」
這個是因爲vs2010的項目設置默認採用了unicode字符集致使的,能夠在項目屬性中將字符集改成多字節便可,也能夠在GetModuleHandle函數的字符串參數加上_T()包含,改成GetModuleHandle(_T("Kernel32.dll"));
靜態庫的使用方法是:
在咱們的程序的工程屬性的VC++目錄的包含目錄中,增長ZThread的頭文件目錄。
在程序代碼中,增長#pragma comment(lib, 「ZThread.lib」)聲明,同時,須要將ZThread.lib文件放在咱們的源目錄下,跟代碼放一塊兒。
方法3,編譯成動態庫DLL
跟方法2差很少,只不過項目類型選擇爲動態庫。其餘步驟同樣,再也不詳述,編譯成功後,會生成ZThread.lib, ZThread.dll。
使用動態庫的方法跟靜態庫一致,不一樣的是,使用動態庫的程序在運行時須要ZThread.dll文件。
至此,靜態連接庫和動態連接庫咱們就說完了,咱們作一下對比和補充:
兩個lib文件的不一樣
咱們發現,不管是靜態連接庫仍是動態連接庫,最後都有lib文件,那麼二者區別是什麼呢?其實,兩個是徹底不同的東西。兩個ZThread.lib大小都不一樣,靜態庫對應的lib文件叫靜態庫,動態庫對應的lib文件叫導入庫。實際上靜態庫自己就包含了實際執行代碼、符號表等等,而對於導入庫而言,其實際的執行代碼位於動態庫中,導入庫只包含了地址符號表等,確保程序找到對應函數的一些基本地址信息。
對於靜態連接庫,咱們在編譯和連接的時候已經將全部的代碼都導入進來,所以,當生成可執行文件之後,可執行文件包含全部的代碼。所以,在可執行文件運行時就再也不須要靜態庫了,這也是爲何咱們刪掉ZThread.lib程序照樣執行;而對於動態連接庫,實際上,可執行文件不包含DLL中的內容,只是經過導入庫(.lib)知道了相應的地址信息,所以,可執行文件在運行時動態得去加載DLL,這也是爲何咱們刪掉ZThread.dll後程序就不能執行了。
對於DLL,咱們是能夠不要lib文件的。若是不要lib文件,咱們能夠經過函數指針的使用達到咱們的目的。
2、在Linux下使用ZThread
在linux下,直接經過三部曲就能夠完成了,很是簡單
./configure
./make
./make install
若是在make時遇到錯誤:
../include/zthread/Guard.h: In destructor 'ZThread::Guard<LockType, LockingPolicy>::~Guard()':
../include/zthread/Guard.h:494: error: there are no arguments to 'isDisabled' that depend on a template parameter, so a declaration of 'isDisabled' must be available
只需 先export CXXFLAGS=-fpermissive,而後再執行
./configure
./make
./make install
就能夠了