最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言編程中借助pthreads庫進行多線程編程的示例

 更新時間:2015年11月19日 17:39:29   作者:jack_Meng  
這篇文章主要介紹了C語言編程中借助pthreads庫進行多線程編程的示例,文中的示例環(huán)境為Windows系統(tǒng),需要的朋友可以參考下

運行之前需要做一些配置:
1.下載PTHREAD的WINDOWS開發(fā)包 pthreads-w32-2-4-0-release.exe(任何一個版本均可)
   http://sourceware.org/pthreads-win32/ ,解壓到一個目錄。
2.找到include和lib文件夾,下面分別把它們添加到VC++6.0的頭文件路徑和靜態(tài)鏈接庫路徑下面:
   a).Tools->Options,選擇Directory頁面,然后在Show directories for:中選擇Include files(默認)     在Directories中添加include的路徑。在Show directories for:中選擇Library files,
    在Directories中添加lib的路徑。
   b).Project->Settings,選擇Link頁面,然后將lib下的*.lib文件添加到Object/library Modules,
     各lib文件以空格隔開。
   c).將lib下的*.dll文件復制到工程目錄下,即根目錄。 

我們進行多線程編程,可以有多種選擇,可以使用WindowsAPI,如果你在使用GTK,也可以使用GTK實現(xiàn)了的線程庫,如果你想讓你的程序有更多的移植性你最好是選擇POSIX中的Pthread函數(shù)庫,我的程序是在Linux下寫的,所以我使用了Pthread庫(是不是很傷心,我知道有不少人期待的是WindowsAPI的,好吧,有機會以后再講那個,現(xiàn)在先把這一系列專題寫完 ^_^)

如果你用的是LINUX/UNIX/MacOSX,那么我們已經(jīng)可以開始了,如果你用的是WINDOWS,那么你需要從網(wǎng)站上下載PTHREAD的WINDOWS開發(fā)包,所幸他非常的小。網(wǎng)站地址是http://sourceware.org/pthreads-win32/

示例
先來看一個基本的例子:

#include <pthread.h>
#include <iostream>

using namespace std;

void* tprocess1(void* args){
   while(1){
     cout << "tprocess1" << endl;
   }
   return NULL;
}

void* tprocess2(void* args){
   while(1){
     cout << "tprocess2" << endl;
   }
   return NULL;
}

int main(){
   pthread_t t1;
   pthread_t t2;
   pthread_create(&t1,NULL,tprocess1,NULL);
   pthread_create(&t2,NULL,tprocess2,NULL);
   pthread_join(t1,NULL);
   return 0;
}

在上面的例子中,我們首先加入了pthread.h文件包含,這是所以pthread多線程程序所必須的,接著是iostream我們進行輸入輸出時要用到,接著就是兩個函數(shù)的定義,這和普通的函數(shù)沒有什么區(qū)別,之所以寫成的

void* tprocess1(void* args)

這樣的形式,完全是為了迎合pthread_create函數(shù)的參數(shù)類型,你也可以不這樣定義,只要在調(diào)用pthread_create創(chuàng)建線程的時候強制轉換一下指針類型就可以了。

這兩個函數(shù)將被用做線程的執(zhí)行體,也就是說在兩個線程里同時運行這兩個函數(shù)。

現(xiàn)在我們來看main函數(shù),和pthread有關的調(diào)用都在這里了。
pthread_t是線程結構,用來保存線程相關數(shù)據(jù),你也可以理解為是線程類型,聲明一個線程對象(變量)。

   pthread_t t1;
   pthread_t t2;

這里我們聲明了兩個線程變量t1,t2

   pthread_create(&t1,NULL,tprocess1,NULL);
   pthread_create(&t2,NULL,tprocess2,NULL);

這兩句非常重要,pthread_create用來創(chuàng)建線程并啟動,他的原型是

int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg);

我們可以知道第一個參數(shù)是線程指針,第二參數(shù)是線程屬性指針,線程屬性pthread_attr_t用來指定線程優(yōu)先級等屬性,一般的情況下,我們沒有必要修改,使用默認屬性來構造線程,所以這里一般取NULL,我們也是這樣做的,第三個參數(shù)是一個函數(shù)指針(函數(shù)指針?什么東西,沒聽說過啊?……巨暈,好嘛,你復習一下C或是C++指針那部分吧)就是線程要執(zhí)行的代碼,這里我們分別要執(zhí)行tprocess1 tprocess2就寫成了上面的樣子,這里這個函數(shù)指針的類型定義是返回一個空類型指針,接收一個空類型指針參數(shù)的函數(shù)指針,如果你的函數(shù)不是這個定義,那就可以直接轉化一下就可以了。

寫完這兩行代碼,兩個線程就已經(jīng)執(zhí)行起來了,但是如果你省略了

   pthread_join(t1,NULL);

然后嘗試編譯運行程序的時候你會發(fā)現(xiàn)程序似乎什么也沒干就退出了,是的,那是因為程序的主線程退出的時候操作系統(tǒng)會關閉應用程序使用的所有資源,包括線程……所以在main函數(shù)結束前我們得想辦法讓程序停下來,pthread_join方法的功能就是等待線程結束,要等的線程就是第一個參數(shù),程序會在這個地方停下來,直到線程結束,第二個參數(shù)用來接受線程函數(shù)的返回值,是void**類型的指針,如果沒有返回值,就直接設為NULL吧。

程序寫好了,我們怎么編譯運行它呢?
如果你使用的是Linux:
在終端里輸入

g++ thread.cpp -othread -lpthread
./thread

就可以完成程序的編譯及運行

如果你用的是VC:
在工程屬性里加入開發(fā)包里的幾個庫文件
把那幾個DLL文件放到你的工程路徑里,也就是程序運行時候的工作路徑,這個在VC6和2005里似乎不太一樣,如果你不確定,那就直接放到SYSTEM32里吧。。。
下面的工作就非常簡單了
點運行,提示編譯,就確定,好了,結果出來了。。。

是不是感覺多線程如此的簡單,短短幾行代碼就搞定了,我想你已經(jīng)可以寫出一個簡單的多線程程序了吧,呵呵,其實問題沒有這么簡單,多線程我們還要面對線程同步的問題,我會在下一個專題里給大家講到。 

相關文章

  • 使用C語言繪制柱形圖的示例代碼

    使用C語言繪制柱形圖的示例代碼

    常用的統(tǒng)計圖有條形圖、柱形圖、折線圖、曲線圖、餅圖、環(huán)形圖、扇形圖,這篇文章主要為大家介紹了C語言中繪制條形圖和柱形圖的方法,需要的可以參考下
    2024-02-02
  • c#中實現(xiàn)退出程序后自動重新啟動程序的方法

    c#中實現(xiàn)退出程序后自動重新啟動程序的方法

    下面小編就為大家?guī)硪黄猚#中實現(xiàn)退出程序后自動重新啟動程序的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • OpenGL繪制貝塞爾曲線

    OpenGL繪制貝塞爾曲線

    這篇文章主要為大家詳細介紹了OpenGL繪制貝塞爾曲線,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++多字節(jié)字符與寬字節(jié)字符相互轉換

    C++多字節(jié)字符與寬字節(jié)字符相互轉換

    最近在C++編程中經(jīng)常遇到需要多字節(jié)字符與寬字節(jié)字符相互轉換的問題,自己寫了一個類來封裝wchar_t與char類型間的轉換
    2012-11-11
  • C語言實現(xiàn)電腦關機程序

    C語言實現(xiàn)電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++選擇排序算法實例

    C++選擇排序算法實例

    這篇文章主要介紹了C++選擇排序算法實例,本文先是介紹了什么是選擇排序,然后給出了實現(xiàn)代碼,需要的朋友可以參考下
    2014-10-10
  • 一篇文章弄懂C++左值引用和右值引用

    一篇文章弄懂C++左值引用和右值引用

    左值(lvalue)和右值(rvalue)是 c/c++ 中一個比較晦澀基礎的概念,這篇文章主要給大家介紹了關于如何通過一篇文章弄懂C++左值引用和右值引用的相關資料,需要的朋友可以參考下
    2021-07-07
  • 深入C語言把文件讀入字符串以及將字符串寫入文件的解決方法

    深入C語言把文件讀入字符串以及將字符串寫入文件的解決方法

    本篇文章是對C語言把文件讀入字符串以及將字符串寫入文件的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++代碼實現(xiàn)鏈隊列詳解

    C++代碼實現(xiàn)鏈隊列詳解

    下面小編就為大家分享一篇C++代碼實現(xiàn)鏈隊列的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧,希望能夠給你帶來幫助
    2021-09-09
  • C++ 實現(xiàn)LRU 與 LFU 的緩存算法

    C++ 實現(xiàn)LRU 與 LFU 的緩存算法

    設計和實現(xiàn)一個LRU 緩存機制。其支持獲取數(shù)據(jù) get 和 寫入數(shù)據(jù) put,設計并實現(xiàn)最少訪問頻率(LFU)緩存的數(shù)據(jù)結構。LFU的每個數(shù)據(jù)塊都有一個引用計數(shù),所有數(shù)據(jù)塊按照引用計數(shù)排序,具有相同引用計數(shù)的數(shù)據(jù)塊則按照時間進行排序。其支持get 和 put,具體了解請看下文
    2021-09-09

最新評論

诸暨市| 黔江区| 日照市| 通城县| 施秉县| 屯门区| 辛集市| 东乌珠穆沁旗| 天等县| 会昌县| 开化县| 金湖县| 杂多县| 吉木萨尔县| 通州区| 略阳县| 济南市| 桦甸市| 尉氏县| 邯郸县| 简阳市| 稷山县| 梨树县| 西峡县| 安仁县| 灵武市| 嘉义县| 灵宝市| 德化县| 宁化县| 巴彦县| 巢湖市| 望奎县| 麻阳| 启东市| 常山县| 札达县| 乐东| 庆城县| 新乡县| 元朗区|