Pthread是由POSIX提出的一套通用的線程庫,在linux平臺下,它被廣泛的支持,而windows平臺下,卻並不被支持,而pthreads-w32爲我們提供瞭解決方案,本文我們準備在我們的windows平臺下進行pthread-w32的安裝,在網絡上有類似的文章,但是講的都是比較老的平臺,在windows8下支持並不全面,不過可以作爲參考。我們在這裏貼出幾個網址,供參考使用。
Windows 7 64bit和Visual Studio 2010下安裝及使用Pthread-w32 2.8
如果你的是XP系統或者win7 32位系統,那麼,那兩篇文章已經足以你完成pthread-w32的安裝了。現在,我們開始講我們的嘗試過程。
一、安裝平臺
windows8 64位系統,Microsoft Visual Studio 2012
二、pthreads-w32 下載地址
我們這裏下載最新版本pthreads-w32-2-9-1
ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip
下載後解壓,可以看到共有三個文件夾
我們用到的主要是“Pre-built.2”這個文件夾下的三個文件夾,分別是動態鏈接庫、頭文件、靜態鏈接庫
三、配置頭文件及靜態鏈接庫
這裏有多種方式,我們這裏只提到我們用到的一種,總之目的是讓我們建立的工程能夠找到對應的頭文件、靜態庫文件,以及運行時程序能夠找到動態鏈接庫文件。
這裏,我們直接把頭文件拷貝到Visual Studio的默認路徑的頭文件中,即把include文件夾中的三個文件直接拷貝到Visual Studio安裝目錄下VC->include文件夾下,例如我將include中文件拷貝到的位置是
E:\Program Files\Microsoft Visual Studio 11.0\VC\include
這樣,我們就不必每次在項目用到時都配置一遍,特別是在Visual Studio2012 貌似不支持全局的頭文件配置時(不確定,如果誰找到了可以告訴我一聲),這種方式對於經常會建一些小項目的人來說,相對節省時間。
同樣的辦法與原因,我們也可以把lib文件夾下的內容拷貝到Visual Studio安裝目錄下默認的lib尋找路徑中,即VC->lib中,例如我將lib文件夾下的x64與x86兩個文件直接拷貝到
E:\Program Files\Microsoft Visual Studio 11.0\VC\lib
的下面。
四、配置動態鏈接庫
和頭文件和靜態鏈接庫的配置方式相似,我們這裏將dll文件夾的內容放到我們程序能夠找到的位置,我們的方案是
把dll下的x64文件夾下的兩個文件,即pthreadGC2.dll與pthreadVC2.dll拷貝到C:\Windows\System32下(用於64位程序的運行)
把dll下的x86文件夾下的五個文件,拷貝到C:\Windows\SysWOW64下(用於32位程序的運行),注意一下,千萬不能將這些文件拷貝反位置,否則,程序運行時會提示說找不到對應的dll文件。這些在網上的很多文章中都被忽略掉了,所以我們特別提出。
五、運行測試
完成以上配置之後,我們運行一下測試程序,證明我們的配置完成了
- //main.cpp
- #include <stdio.h>
- #include <pthread.h>
- #include <assert.h>
-
- #pragma comment(lib,"x86/pthreadVC2.lib")
-
- void* Function_t(void* Param)
- {
- printf("我是線程! ");
- pthread_t myid = pthread_self();
- printf("線程ID=%d ", myid);
- return NULL;
- }
-
- int main()
- {
- pthread_t pid;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_create(&pid, &attr, Function_t, NULL);
- printf("======================================== ");
- getchar();
- pthread_attr_destroy(&attr);
- return 0;
- }
這裏,我們需要注意的是我們的第6行代碼,我們需要在代碼中包含入靜態鏈接庫(注意,根據不同的編譯選項,選擇x86還是x64,如果不相配,將無法鏈接完成)
#pragma comment(lib,"x86/pthreadVC2.lib")