Windows平臺下使用pthreads開發多執行緒應用
pthreads簡介
POSIX 1003.1-2001標準定義了編寫多執行緒應用程式的API(應用程式程式設計介面),這個介面通常被稱為pthreads。在常見的作業系統中,例如Unix、Linux、MacOS等都使用pthreads作為作業系統的執行緒。
Windows作業系統和其他平臺不同,並不是與生俱來的就支援phreads,使用Win32或MFC編寫過應用程式的朋友應該都知道,Windows平臺可以通過系統對外提供的執行緒相關函式(例如CreateThread、TerminateThread等)建立多執行緒應用。
使用Windows API編寫應用沒有什麼問題,但是當我們想編寫跨平臺應用時就顯得有點困難。幸運的是phreads目前存在一套Windows平臺下的移植版本,稱為pthreads-win32。接下來筆者將使用Visual Studio2012作為開發工具,簡單的介紹在Win32平臺下如何使用這套執行緒庫。
pthreads-win32下載
筆者使用的是2.9.1版本,解壓後可以看到Pre-built.2和pthreads.2資料夾。Pre-built.2為編譯好的庫檔案和標頭檔案,也是我們將要用到的,pthreads.2目錄下為原始碼。
pthreads-win32使用
1.使用VS2012建立控制檯應用,將字符集設定為多位元組字符集。
2.將Pre-built.2目錄下的include和lib資料夾拷貝到解決方案根目錄下。如下圖所示:
3.在專案上點選右鍵選擇屬性,配置屬性->VC++目錄 下的包含目錄新增$(SolutionDir)include
,庫目錄
$(SolutionDir)lib\x86
;配置屬性->連結器->輸入->附加依賴項 中新增pthreadVC2.lib
4.編寫測試程式碼如下:
#include "stdafx.h"
#include <pthread.h>
#include <iostream>
//供執行緒休眠函式pthread_delay_np使用
struct timespec delay = {2 ,0};
void* print_task_1(void* )
{
while(true)
{
std::cout<<"print_task_1 function is called!" <<std::endl;
pthread_delay_np(&delay);
}
}
void* print_task_2(void* )
{
while(true)
{
std::cout<<"print_task_2 function is called!"<<std::endl;
pthread_delay_np(&delay);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
pthread_t handle[2];
if(pthread_create(&handle[0],0,print_task_1,0))
{
std::cout<<"thread create failed!"<<std::endl;
return EXIT_FAILURE;
}
if(pthread_create(&handle[1],0,print_task_2,0))
{
std::cout<<"thread create failed!"<<std::endl;
return EXIT_FAILURE;
}
system("pause");
return 0;
}
在main函式中,我們通過pthread_create建立兩個執行緒,執行緒處理函式print_task_1和print_task_2每休息2s後不斷向控制檯輸出語句。呼叫system(“pause”)使主執行緒暫停。
編譯執行可以發現兩條執行緒正常工作,更深入用法請參考官方提供的文件。