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

關(guān)于C語言多線程pthread庫的相關(guān)函數(shù)說明

 更新時(shí)間:2017年05月14日 09:24:54   投稿:jingxian  
下面小編就為大家?guī)硪黄P(guān)于C語言多線程pthread庫的相關(guān)函數(shù)說明。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

線程相關(guān)操作說明

一 pthread_t

pthread_t在頭文件/usr/include/bits/pthreadtypes.h中定義:

typedef unsigned long int pthread_t;

它是一個(gè)線程的標(biāo)識(shí)符。

二 pthread_create

函數(shù)pthread_create用來創(chuàng)建一個(gè)線程,它的原型為:

extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,

void *(*__start_routine) (void *), void *__arg));

第一個(gè)參數(shù)為指向線程標(biāo)識(shí)符的指針,第二個(gè)參數(shù)用來設(shè)置線程屬性,第三個(gè)參數(shù)是線程運(yùn)行函數(shù)的起始地址,最后一個(gè)參數(shù)是運(yùn)行函數(shù)的參數(shù)。這里,我們的函數(shù)thread不需要參數(shù),所以最后一個(gè)參數(shù)設(shè)為空指針。第二個(gè)參數(shù)我們也設(shè)為空指針,這樣將生成默認(rèn)屬性的線程。對(duì)線程屬性的設(shè)定和修改我們將在下一節(jié)闡述。當(dāng)創(chuàng)建線程成功時(shí),函數(shù)返回0,若不為0則說明創(chuàng)建線程失敗,常見的錯(cuò)誤返回代碼為EAGAIN和EINVAL.前者表示系統(tǒng)限制創(chuàng)建新的線程,例如線程數(shù)目過多了;后者表示第二個(gè)參數(shù)代表的線程屬性值非法。創(chuàng)建線程成功后,新創(chuàng)建的線程則運(yùn)行參數(shù)三和參數(shù)四確定的函數(shù),原來的線程則繼續(xù)運(yùn)行下一行代碼。

三 pthread_join pthread_exit

函數(shù)pthread_join用來等待一個(gè)線程的結(jié)束。函數(shù)原型為:

extern int pthread_join __P ((pthread_t __th, void **__thread_return));

第一個(gè)參數(shù)為被等待的線程標(biāo)識(shí)符,第二個(gè)參數(shù)為一個(gè)用戶定義的指針,它可以用來存儲(chǔ)被等待線程的返回值。這個(gè)函數(shù)是一個(gè)線程阻塞的函數(shù),調(diào)用它的函數(shù)將一直等待到被等待的線程結(jié)束為止,當(dāng)函數(shù)返回時(shí),被等待線程的資源被收回。一個(gè)線程的結(jié)束有兩種途徑,一種是象我們上面的例子一樣,函數(shù)結(jié)束了,調(diào)用它的線程也就結(jié)束了;另一種方式是通過函數(shù)pthread_exit來實(shí)現(xiàn)。

它的函數(shù)原型為:

extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));

唯一的參數(shù)是函數(shù)的返回代碼,只要pthread_join中的第二個(gè)參數(shù)thread_return不是NULL,這個(gè)值將被傳遞給 thread_return.最后要說明的是,一個(gè)線程不能被多個(gè)線程等待,否則第一個(gè)接收到信號(hào)的線程成功返回,其余調(diào)用pthread_join的線程則返回錯(cuò)誤代碼ESRCH.

在這一節(jié)里,我們編寫了一個(gè)最簡(jiǎn)單的線程,并掌握了最常用的三個(gè)函數(shù)pthread_create,pthread_join和pthread_exit.下面,我們來了解線程的一些常用屬性以及如何設(shè)置這些屬性。

互斥鎖相關(guān)

互斥鎖用來保證一段時(shí)間內(nèi)只有一個(gè)線程在執(zhí)行一段代碼。

一 pthread_mutex_init

函數(shù)pthread_mutex_init用來生成一個(gè)互斥鎖。NULL參數(shù)表明使用默認(rèn)屬性。如果需要聲明特定屬性的互斥鎖,須調(diào)用函數(shù) pthread_mutexattr_init.函數(shù)pthread_mutexattr_setpshared和函數(shù) pthread_mutexattr_settype用來設(shè)置互斥鎖屬性。前一個(gè)函數(shù)設(shè)置屬性pshared,它有兩個(gè)取值, PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED.前者用來不同進(jìn)程中的線程同步,后者用于同步本進(jìn)程的不同線程。在上面的例子中,我們使用的是默認(rèn)屬性PTHREAD_PROCESS_ PRIVATE.后者用來設(shè)置互斥鎖類型,可選的類型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT.它們分別定義了不同的上所、解鎖機(jī)制,一般情況下,選用最后一個(gè)默認(rèn)屬性。

二 pthread_mutex_lock pthread_mutex_unlock pthread_delay_np

pthread_mutex_lock聲明開始用互斥鎖上鎖,此后的代碼直至調(diào)用pthread_mutex_unlock為止,均被上鎖,即同一時(shí)間只能被一個(gè)線程調(diào)用執(zhí)行。當(dāng)一個(gè)線程執(zhí)行到pthread_mutex_lock處時(shí),如果該鎖此時(shí)被另一個(gè)線程使用,那此線程被阻塞,即程序?qū)⒌却搅硪粋€(gè)線程釋放此互斥鎖。

下面先來一個(gè)實(shí)例。我們通過創(chuàng)建兩個(gè)線程來實(shí)現(xiàn)對(duì)一個(gè)數(shù)的遞加。

 #include

 #include

 #include

 #include

 #define MAX 10

 pthread_t thread[2];

 pthread_mutex_t mut;

 int number=0, i;

 void *thread1()

 {

 printf ("thread1 : I'm thread 1\n");

 for (i = 0; i < MAX; i++)

 {

 printf("thread1 : number = %d\n",number);

 pthread_mutex_lock(&mut);

 number++;

 pthread_mutex_unlock(&mut);

 sleep(2);

 }

 printf("thread1 :主函數(shù)在等我完成任務(wù)嗎?\n");

 pthread_exit(NULL);

 }

 void *thread2()

 {

 printf("thread2 : I'm thread 2\n");

 for (i = 0; i < MAX; i++)

 {

 printf("thread2 : number = %d\n",number);[nextpage]

 pthread_mutex_lock(&mut);

 number++;

 pthread_mutex_unlock(&mut);

 sleep(3);

 }

 printf("thread2 :主函數(shù)在等我完成任務(wù)嗎?\n");

 pthread_exit(NULL);

 }

 void thread_create(void)

 {

 int temp;

 memset(&thread, 0, sizeof(thread)); //comment1

 /*創(chuàng)建線程*/

 if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2

 printf("線程1創(chuàng)建失敗!\n");

 else

 printf("線程1被創(chuàng)建\n");

 if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3

 printf("線程2創(chuàng)建失敗");

 else

 printf("線程2被創(chuàng)建\n");

 }

 void thread_wait(void)

 {

 /*等待線程結(jié)束*/

 if(thread[0] !=0) { //comment4

 pthread_join(thread[0],NULL);

 printf("線程1已經(jīng)結(jié)束\n");

 }

 if(thread[1] !=0) { //comment5

 pthread_join(thread[1],NULL);

 printf("線程2已經(jīng)結(jié)束\n");

 }

 }

 int main()

 {

 /*用默認(rèn)屬性初始化互斥鎖*/

 pthread_mutex_init(&mut,NULL);

 printf("我是主函數(shù)哦,我正在創(chuàng)建線程,呵呵\n");

 thread_create();

 printf("我是主函數(shù)哦,我正在等待線程完成任務(wù)阿,呵呵\n");

 thread_wait();

 return 0;

 }

下面我們先來編譯、執(zhí)行一下

引文:

falcon@falcon:~/program/c/code/ftp$ gcc -lpthread -o thread_example thread_example.c

falcon@falcon:~/program/c/code/ftp$ ./thread_example

我是主函數(shù)哦,我正在創(chuàng)建線程,呵呵

線程1被創(chuàng)建

線程2被創(chuàng)建

我是主函數(shù)哦,我正在等待線程完成任務(wù)阿,呵呵

thread1 : I'm thread 1

thread1 : number = 0

thread2 : I'm thread 2

thread2 : number = 1

thread1 : number = 2

thread2 : number = 3

thread1 : number = 4

thread2 : number = 5

thread1 : number = 6

thread1 : number = 7

thread2 : number = 8

thread1 : number = 9

thread2 : number = 10

thread1 :主函數(shù)在等我完成任務(wù)嗎?

線程1已經(jīng)結(jié)束

thread2 :主函數(shù)在等我完成任務(wù)嗎?

線程2已經(jīng)結(jié)束

以上這篇關(guān)于C語言多線程pthread庫的相關(guān)函數(shù)說明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • OpenCV圖像處理之圖像拼接詳解

    OpenCV圖像處理之圖像拼接詳解

    本文主要介紹了如何使用C++?OpenCV實(shí)現(xiàn)圖像景拼接,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定的幫助,感興趣的可以了解一下
    2022-08-08
  • C++實(shí)現(xiàn)LeetCode(904.水果裝入果籃)

    C++實(shí)現(xiàn)LeetCode(904.水果裝入果籃)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(904.水果裝入果籃),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言的getc()函數(shù)和gets()函數(shù)的使用對(duì)比

    C語言的getc()函數(shù)和gets()函數(shù)的使用對(duì)比

    這篇文章主要介紹了C語言的getc()函數(shù)和gets()函數(shù)的使用對(duì)比,從數(shù)據(jù)流中一個(gè)是讀取字符一個(gè)是讀取字符串,需要的朋友可以參考下
    2015-08-08
  • c++實(shí)現(xiàn)md5加密的代碼

    c++實(shí)現(xiàn)md5加密的代碼

    這篇文章主要介紹了c++實(shí)現(xiàn)md5加密的實(shí)例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C++數(shù)組指針和二維數(shù)組詳情

    C++數(shù)組指針和二維數(shù)組詳情

    這篇文章主要介紹了C++數(shù)組指針和二維數(shù)組,指針數(shù)組和二維數(shù)組在應(yīng)用中常用于函數(shù)傳參,下面我們就來看看指針數(shù)組和二維數(shù)組在應(yīng)用中的具體使用吧,需要的朋友可以參考一下
    2021-10-10
  • C語言實(shí)現(xiàn)跨文件傳輸數(shù)據(jù)的幾種方式

    C語言實(shí)現(xiàn)跨文件傳輸數(shù)據(jù)的幾種方式

    C語言是一種強(qiáng)大的、通用的編程語言,常用于系統(tǒng)級(jí)編程,包括硬件交互,如中斷處理和數(shù)據(jù)采集,在本文中,我們將深入探討如何使用C語言進(jìn)行跨文件數(shù)據(jù)傳輸,文中有相關(guān)的代碼供大家參考,需要的朋友可以參考下
    2024-08-08
  • 詳解c++中的trait與policy模板技術(shù)

    詳解c++中的trait與policy模板技術(shù)

    trait模板和policy模板技術(shù)是把模板的trait和policy這兩個(gè)針對(duì)不同具體類型有變化的方面抽離出來形成兩個(gè)獨(dú)立的模板。由于trait和policy本身是模板,它的行為是可配置的,在模板中通過組合或者以模板實(shí)參傳進(jìn)來的方式使用trait和policy,就可以配置出不同的具體實(shí)現(xiàn)
    2021-06-06
  • 8皇后問題的解法實(shí)例代碼

    8皇后問題的解法實(shí)例代碼

    8皇后問題的解法實(shí)例代碼,需要的朋友可以參考一下
    2013-03-03
  • C++實(shí)現(xiàn)LeetCode(169.求大多數(shù))

    C++實(shí)現(xiàn)LeetCode(169.求大多數(shù))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(169.求大多數(shù)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++list的模擬實(shí)現(xiàn)

    C++list的模擬實(shí)現(xiàn)

    list是數(shù)據(jù)結(jié)構(gòu)中的鏈表,在C++的STL中,有l(wèi)ist的模板,STL中的list的結(jié)構(gòu)是帶頭雙向循環(huán)鏈表,當(dāng)然STL中還有一個(gè)forward_list的鏈表,這個(gè)鏈表是一個(gè)帶頭的單鏈表。為了更好的理解list,我們來對(duì)其進(jìn)行模擬實(shí)現(xiàn)。,需要的朋友可以參考
    2023-04-04

最新評(píng)論

磐安县| 六安市| 名山县| 盐亭县| 信宜市| 长葛市| 万盛区| 叶城县| 丘北县| 如皋市| 惠水县| 营口市| 西乌珠穆沁旗| 清水县| 连云港市| 昆山市| 广河县| 正定县| 和平县| 雅安市| 海门市| 宁南县| 龙泉市| 清河县| 绍兴县| 丰台区| 翁牛特旗| 三台县| 琼海市| 耒阳市| 砀山县| 乐昌市| 宣威市| 天祝| 来宾市| 枣阳市| 宣化县| 江永县| 嘉祥县| 宜昌市| 岑溪市|