只有還沒做出來的,沒有想不到的。
從linux移植到windows的C++程序,肯定要改造下 socket和線程庫。
某日,突然想到 windows 可以使用pthread庫么?搜索,果然有線程的解決方案。
1.下載:http://sourceware.org/pthreads-win32/#download
直接下載最新的就行,目前是: prebuilt-dll-2-9-1-release.zip 因為是windows平台的,所以下載 .zip 或。exe就行,.exe 就是自解壓而已,別無其他。最新版本 沒有.exe的下載版本了,其內容和zip的一樣。但是 zip和 tar.gz tar.bz2的 不太一樣。zip比較全,包括了 已經編譯好的二進制Pre-built.2,源碼pthreads.2,還有一個3.QueueUserAPCEx 不知道到底干什么用的,是一個alert的driver,編譯 需要 DDK ,默認vs2010 沒有安裝。Windows Device Driver Kit NTDDK.h 需要額外單獨安裝。
2.安裝這些開發庫到你的環境中,包括 lib 到vs的lib文件夾,dll到path目錄中,include到vs的include文件夾中。這樣比較方便么。
寫兩個個腳本 容易實現的:
rem put this file to :D:\#win pthread\pthreads-w32-2-9-1-release\Pre-built.2 copy include\pthread.h "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\"pthread.h copy include\sched.h "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\"sched.h copy include\semaphore.h "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\"semaphore.h copy dll\x86\pthreadVC2.dll %windir%\pthreadVC2.dll copy dll\x86\pthreadVCE2.dll %windir%\pthreadVCE2.dll copy dll\x86\pthreadVSE2.dll %windir%\pthreadVSE2.dll copy lib\x86\pthreadVC2.lib "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\"pthreadVC2.lib copy lib\x86\pthreadVCE2.lib "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\"pthreadVCE2.lib copy lib\x86\pthreadVSE2.lib "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\"pthreadVSE2.lib ping -n 2 127.1>nul
rem put this file to :D:\#win pthread\pthreads-w32-2-9-1-release\Pre-built.2 del /f /a /q "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\"pthread.h del /f /a /q "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\"sched.h del /f /a /q "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\"semaphore.h del /f /a /q %windir%\pthreadVC2.dll del /f /a /q %windir%\pthreadVCE2.dll del /f /a /q %windir%\pthreadVSE2.dll del /f /a /q "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\"pthreadVC2.lib del /f /a /q "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\"pthreadVCE2.lib del /f /a /q "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\"pthreadVSE2.lib ping -n 2 127.1>nul
以上 路徑 可能不一樣,請自行更正。
3.測試 windows下的pthread庫
#include<stdio.h> #include<pthread.h> #include<Windows.h> #pragma comment(lib, "pthreadVC2.lib") //必須加上這句 void*Function_t(void* Param) { pthread_t myid = pthread_self(); while(1) { printf("線程ID=%d \n", myid); Sleep(4000); } return NULL; } int main() { pthread_t pid; pthread_create(&pid, NULL, Function_t,NULL); while (1) { printf("in fatherprocess!\n"); Sleep(2000); } getchar(); return 1; }
這個是直接copy網友的,例子不是特別的好,僅僅使用到了pthread_create.
包括了 windows.h 和pthread.h 頭文件。
由於其是使用 DLL 方式鏈接 pthread庫的,所以,dll需要到path路徑中去,放到 可執行文件目錄也行。至於能否 直接靜態鏈接 到可執行文件,我想 應該 特別容易了,自己編譯下 windows pthread庫就可以了。
編譯 這個 測試文件 我也寫個 批處理,以后 直接看到批處理,就什么都明白了。
rem 0.=========初始化 VS環境 call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86 rem 1.========= rem 源文件中添加 #pragma comment(lib, "pthreadVC2.lib") cl.exe testWPthread.cpp rem 2.========= rem cl.exe testWPthread.cpp /c /I"c:\pthreads-w32-2-7-0-release\Pre-built.2\include" rem link.exe testWPthread.obj /LIBPATH:"c:\pthreads-w32-2-7-0-release\Pre-built.2\lib" pthreadVC2.lib testWPThread.exe del /f *.exe del /f *.obj cmd
鏈接 lib庫 ,在cl.exe編譯器下 可以通過 #pragma comment(lib, "pthreadVC2.lib") 或者 加入 到cl.exe 的參數中去 都可以。
如何編譯 windows pthread庫,以及 如何更改成 靜態鏈接庫,請聽下回分解。
參考鏈接: