Linux C/C++多线程pthread实例
Linux首先需要安裝GCC/G++編譯環境,方法本文從略,然后建個test.c或test.cpp文件。
本文測試系統Ubuntu 11.10。GCC編譯器截至發文日期止最新的版本,現在不在辦公室下次補上。
1、pthread_create函數定義
int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void), void *restrict arg);
參數1:指向線程標識符指針。
參數2:線程屬性。
參數3:線程運行函數起始地址。
參數4:運行函數的參數。
創建線程成功時,函數返回0,若不為0則說明創建線程失敗,常見的錯誤返回代碼為EAGAIN和EINVAL。前者表示系統限制創建新的線程,例如線程數目過多了;后者表示第二個參數代表的線程屬性值非法。
2、源碼包含pthread頭文件
include <pthread.h>
3、創建多線程示例程序C格式
#include <pthread.h> #include <stdio.h> #include <stdlib.h>pthread_t ntid;void *fnThreadFun(void *para){//... return ((void *)0); }int main(){int err;err = pthread_create(&ntid,NULL,fnThreadFun,NULL); if(err != 0){ printf("can't create thread: %s\n",strerror(err)); return 1; } sleep(1); return 0; }4、創建多線程示例程序C++格式
ctest.h
#include <pthread.h>class ctest{public:ctest();~ctest();private:void createthread();};ctest.cpp
ctest::ctest(){} ctest::~ctest(){} void* fnThreadFun(void *para){ //... return ((void *)0); }void ctest::createthread() { pthread_t ntid; err = pthread_create(&ntid,NULL,fnThreadFun,NULL); if(err != 0){ printf("can't create thread: %s\n",strerror(err)); return 1; } }test.cpp
#include ctest.hint main(){ctest tst;tst.createthread();while(1){//...sleep(1);} return 0;}另外,也可以把線程函數設計到類中,但是必須聲明為static類型,天緣認為完全沒這個必要,因為static類型函數在編譯時仍然是先分配全局地址,反倒直接用全局似乎看起來更規整,就是注意點,把函數名取好就可以了。
4、編譯執行多線程程序
編譯上述多線程程序,必須使用 -lpthread編譯選項,因為pthread庫不是Linux默認鏈接庫,鏈接時必須指定使用libpthread.a庫(天緣機子ubuntu11.10這些庫在/usr/lib/i386-linux-gnu路徑下),在編譯選項中需添加-lpthread參數,示例如:
C編譯選項:
>gcc test.c -o test -lpthread
C++編譯選項:
>g++ ctest.cpp test.cpp -o test -lpthread
如果是寫到MAKEFILE中,可以找到類似TARG_OPTIONS=這樣的位置添加-lpthread。
但是往往還是會報告pthread_create未聲明問題,說明編譯器仍未找到libpthead.a的位置,這時可手動在編譯命令行中添加:-L./usr/lib/i386-linux-gnu 選項(這里的路徑是libthread.a路徑,不同系統、機子可能有所不同!!)。
執行:
>./test
5、pthread注意事項
注意,pthread_create第三個參數,也就是線程回調函數格式為:
void* fnThreadFun(void* param)
{
? return NULL;//或return ((void *)0);
}
其返回值為void*型指針,如果寫成void fnThreadFun(void* param)形式,那么編譯會報告:
error: invalid conversion from ‘void (*)(void*)’ to ‘void* (*)(void*)’ [-fpermissive]
錯誤。
寫成:
err = pthread_create(&ntid,NULL,(void*)&fnThreadFun,NULL);
樣式似乎也不行,gcc編譯時不會出錯,但是用g++就會有問題(也會報告上面錯誤。),究其原因就是C語言編譯器允許隱含性的將一個通用指針轉換為任意類型的指針,而C++不允許(http://www.4ucode.com/Study/Topic/1353180)。
參考地址:
http://zhuwenlong.blog.51cto.com/209020/40339
線程互斥和解鎖請參考:
http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/index.html
http://hi.baidu.com/see_yee/blog/item/139fe0243198ad34c8955917.html
http://en.wikipedia.org/wiki/POSIX_Threads
總結
以上是生活随笔為你收集整理的Linux C/C++多线程pthread实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GCC + pthread
- 下一篇: linux shell 自定义函数(定义