日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux C/C++多线程pthread实例

發布時間:2023/12/2 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux C/C++多线程pthread实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

inux中C/C++開發多線程程序多遵循POSIX線程接口(也就是pthread),pthread涉及函數很多個(更多參見pthread.h頭文件),常用的有pthread_create、pthread_dispath、pthread_mutex_lock(互斥鎖定)、pthread_mutex_unlock(互斥解鎖)等。入門而言,先把線程創建出來,然后編譯通過之后再慢慢完善,具體步驟如下。

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实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。