這幾天在研究C++內(nèi)存管理器的多線程版本,其中用到了POSIX的pthread.h。于是我就想測(cè)試一下其中的代碼,但網(wǎng)上查發(fā)現(xiàn)這是Linux環(huán)境下的庫。Windows本身沒有提供對(duì)POSIX的支持。但有一個(gè)叫 POSIX Threads forWin32 的開源項(xiàng)目給出了一個(gè)功能比較完善的Windows下pthreads API的實(shí)現(xiàn)。目前的最新版本是Pthreads-w32release 2.8.0(2006-12-22)。我的探索過程就是在使用這個(gè)API的過程在摸索的,我把過程都寫下來,希望對(duì)以后探索這個(gè)API使用的同學(xué)會(huì)有好處。
首先去搜索pthread.h的下載很快就會(huì)找到pthreads庫的下載地址,
http://sourceware.org/pthreads-win32/。ps:校園網(wǎng)的用戶是上不了外國(guó)網(wǎng)站的,我用了個(gè)計(jì)時(shí)的代理,挺便宜的,需要的時(shí)候就連接,下載完了就斷開,呵呵,用迅雷下載會(huì)快很多哦。我下載了一個(gè)較新的發(fā)布版本:pthreads-w32-2-8-0-release.exe,這是一個(gè)自解壓文件,我把它解壓在D:\ProgramFiles\pthread\,解壓后會(huì)有文件夾Pre-built.2,這里包含了需要用到的頭文件和鏈接文件。
之后就寫了一個(gè)測(cè)試多線程的代碼,如下:testThread.cpp
#include<pthread.h>
#include<iostream>
using std::cout;
using std::endl;
using std::cin;
class ABClock{
public:
virtual ~ABClock(){}
virtual void lock()=0;
virtual void unlock()=0;
};
class MutexLock:public ABClock{
public:
MutexLock(){ pthread_mutex_init(&alock,NULL);}
~MutexLock(){ pthread_mutex_destroy( &alock);}
inline void lock(){ pthread_mutex_lock(&alock);}
inline void unlock(){ pthread_mutex_unlock( &alock);}
private:
pthread_mutex_t alock;
};
int main()
{
cout<<"hello"<<endl;
MutexLock thelock;
thelock.lock();
cout<< "locked"<<endl;
thelock.unlock();
int a;
cin>>a;
return 0;
}
上面代碼就是直接調(diào)用pthreads中的函數(shù)來實(shí)現(xiàn)線程鎖,但編譯肯定是通不過的了,提示找不到頭文件pthread.h。
不了解VC的后果呀,這時(shí)候真想有個(gè)同學(xué)或老師可以輔導(dǎo)我,但是應(yīng)該找不到了,同學(xué)又沒興趣理這個(gè),老師就更不用說,而且老師也不一定知道這個(gè)。我只能在百度知道求助了。
http://zhidao.baidu.com/question/69168684.html這是這個(gè)貼?;卮鹫f在VC里的Tool的Option里增加了頭文件的路徑就行了。試了一下,果然找得到頭文件了,至少編譯通過了,但連接沒通過。但百度知道他的回答也解決了上一個(gè)問題,馬上選為最佳答案。
之后的編譯過程老是不能成功,問題提示連接錯(cuò)誤。VC6.0的錯(cuò)誤提示是這樣的:
--------------------Configuration: testThread - Win32 Debug--------------------
Linking...
testThread.obj : error LNK2001: unresolved external symbol __imp__pthread_mutex_init
testThread.obj : error LNK2001: unresolved external symbol __imp__pthread_mutex_destroy
testThread.obj : error LNK2001: unresolved external symbol __imp__pthread_mutex_lock
testThread.obj : error LNK2001: unresolved external symbol __imp__pthread_mutex_unlock
Debug/testThread.exe : fatal error LNK1120: 4 unresolved externals
Error executing link.exe.
testThread.exe - 5 error(s), 0 warning(s)
我把這些連接錯(cuò)誤提示在Google里搜索,倒也真的找到了幾個(gè)同樣情況的帖子,都在在國(guó)外的網(wǎng)站來的,但網(wǎng)頁里的內(nèi)容是一個(gè)樣的,就是一個(gè)程序?qū)懡o某某的郵件,提到了這個(gè)問題,但沒有解答。在百度里根據(jù)就是一些沒用的結(jié)果。看來沒辦法了,我這樣的搜索高手都搜不到。暫時(shí)放棄了這個(gè)調(diào)試的過程。
但有一個(gè)問題疙瘩在心里總不舒服,而且還要研究多線程內(nèi)存池的性能問題,又開始各種嘗試了。我想使用一個(gè)公布的CAPI的使用方法都類似吧。想到了計(jì)算機(jī)圖形學(xué)里老師教我們使用OpenGL庫的方法,馬上找老師的課件找出來,這些課件都還保留在電腦里,我的硬盤大嘛。
按使用OpenGL庫的方法,在VC里安裝OpenGL的過程就是幾個(gè)復(fù)制過程,原本內(nèi)容是這樣的:
GLUT的安裝
下載glut包,包含5個(gè)文件:glut.h, glut.lib, glut32.lib, glut.dll, glut32.dll
以VisualStudio 6 為例,(VisualStudio2005等類似)
把glut.h 放到vc安裝文件夾的include文件夾的gl目錄下(若不確定路徑,用查找文件gl.h 搜索,放在與gl.h 相同的文件夾中)
把glut.lib glut32.lib 放到vc安裝文件夾的lib文件夾中
把glut.dll glut32.dll 放到windows\system32文件夾內(nèi)
我用類似文件的復(fù)制過去,感到一陣輕松,這么辛苦的調(diào)試過程應(yīng)該可以結(jié)束了吧,心里自然高興。用VC6.0打開testThread.cpp點(diǎn)編譯,成功,點(diǎn)連接,結(jié)果馬上出現(xiàn)。我又沮喪了。還是同樣的提示連接錯(cuò)誤。這什么問題呢。這已經(jīng)接近崩潰...
每當(dāng)崩潰的時(shí)候我會(huì)想起百度知道,又去問題了一個(gè)問題,但這個(gè)問題太偏,我想找到答案的希望也不大,就是這個(gè)帖子:
http://zhidao.baidu.com/question/69334905.html。
只能等別人回答了,看一下連續(xù)劇吧,減少一下壓力,最近在看少年青天第一部,呵呵,第三部看完了。我還是喜歡這種推理形的連續(xù)劇。之前看完了神探狄仁杰1,2,3部了,嘿。
又過了一天,我想憑我的搜索水平,如果在網(wǎng)上有這個(gè)問題的解答,我一定能把它搜出來的,主要是關(guān)鍵詞的選取問題而已,當(dāng)然Google才是搜索的主角。(我在賣廣告嗎?)之前我都是搜索那些連接錯(cuò)誤的信息。太偏了吧。就改為搜索 "C++ 多線程",根據(jù)結(jié)果慢慢的修改關(guān)鍵詞,改到'C++線程", "Windows 線程",竟能把我在百度知道里的提問搜出來,看來百度知道的PageRank還是挺高的嘛。最后搜索"Windowspthread”的時(shí)候奇跡出來了,Google都被我的執(zhí)著感到了吧。
終于被我搜到了“Windows下 POSIX 線程編程":
http://read.newbooks.com.cn/info/179364.html。這遍文件解決了我的問題。其中介紹指定link時(shí)要連接的庫的名稱(pthreadVC2.lib),在VC++ 6.0(工程--》設(shè)置--》連接)里的庫模塊里增加pthreadVC2.lib,連接就通過了,運(yùn)行出現(xiàn)了可愛的預(yù)計(jì)結(jié)果:
hello
locked
那時(shí)已經(jīng)是深夜1點(diǎn)半左右了,非常高興,感到心頭有點(diǎn)放松,我想應(yīng)該睡一覺舒舒服服的了吧,就睡了。
我想這個(gè)探索差不多接近尾聲了,但想到VC6.0就有成功了,但在DEV-C++或在其它編譯器里又怎么辦呢。
在前面的那帖子里順藤摸瓜的找到了候捷的一篇文件,在 console mode 中使用 C/C++ 編譯器:
http://blog.csdn.net/liuyongjin1984/archive/2008/01/07/2029405.aspx。其實(shí)各種編譯器都在以這些配置作為參數(shù)調(diào)用編譯,連接命令而已。如果會(huì)在命令行里的自己編譯了,就應(yīng)該把這個(gè)掌握了。就采用命令行的方式再編譯一次。類似于這樣:
》cl.exe main.cpp /c /I"c:pthreads-w32-2-7-0-releasePre-built.2include"
》link.exe /out:main_cl.exe main.obj /LIBPATH:"c:pthreads-w32-2-7-0-releasePre-built.2lib" pthreadVC2.lib
果然能成功編譯連接,探索完畢。
終于寫完了,在學(xué)習(xí)的過程中互聯(lián)網(wǎng)發(fā)揮了極大的作用呀,最重要的就是Google了。追本溯源,其實(shí)佩奇和布林才是我要謝的人啦。這個(gè)探索應(yīng)該告一段落了,我要繼續(xù)探索多線程的問題了,特別把這經(jīng)歷寫下來,以作記念。