亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關(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ù)說明就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++可調(diào)用對(duì)象callable object深入分析

    C++可調(diào)用對(duì)象callable object深入分析

    所謂的callable object,表示可以被某種方式調(diào)用其某些函數(shù)的對(duì)象。它可以是:一個(gè)函數(shù)、一個(gè)指向成員函數(shù)的指針、一個(gè)函數(shù)對(duì)象,該對(duì)象擁有operator()、一個(gè)lambda表達(dá)式,嚴(yán)格的說它是一種函數(shù)對(duì)象
    2022-08-08
  • C++基礎(chǔ)學(xué)生管理系統(tǒng)

    C++基礎(chǔ)學(xué)生管理系統(tǒng)

    這篇文章主要介紹了C++基礎(chǔ)學(xué)生管理系統(tǒng)的相關(guān)資料,包括了文件處理代碼,鏈表處理代碼,以及自定義代碼,主函數(shù)自定義,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 幫VS2019 找回丟失的 SDK問題

    幫VS2019 找回丟失的 SDK問題

    最近很多朋友向小編求助在機(jī)器上的 vs2019 編譯 C++ 工程報(bào)錯(cuò)問題,今天小編給大家分享幫VS2019 找回丟失的 SDK問題,感興趣的朋友一起看看吧
    2020-05-05
  • C++示例講解觀察者設(shè)計(jì)模式

    C++示例講解觀察者設(shè)計(jì)模式

    觀察者模式是極其重要的一個(gè)設(shè)計(jì)模式,也是我?guī)啄觊_發(fā)過程中使用最多的設(shè)計(jì)模式,本文首先概述觀察者模式的基本概念和Demo實(shí)現(xiàn),接著是觀察者模式在C++中的應(yīng)用,最后是對(duì)觀察者模式的應(yīng)用場(chǎng)景和優(yōu)缺點(diǎn)進(jìn)行總結(jié)
    2022-12-12
  • 單線程會(huì)導(dǎo)致死鎖你知道嗎

    單線程會(huì)導(dǎo)致死鎖你知道嗎

    這篇文章主要為大家詳細(xì)介紹了單線程會(huì)不會(huì)導(dǎo)致死鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++取得當(dāng)前時(shí)間的方法

    C++取得當(dāng)前時(shí)間的方法

    這篇文章主要介紹了C++取得當(dāng)前時(shí)間的方法,實(shí)例展示了通過系統(tǒng)函數(shù)獲取當(dāng)前時(shí)間的實(shí)現(xiàn)方法,非常簡(jiǎn)單易懂,需要的朋友可以參考下
    2014-10-10
  • C++實(shí)現(xiàn)快速排序(Quicksort)算法

    C++實(shí)現(xiàn)快速排序(Quicksort)算法

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)快速排序(Quicksort)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)整理

    《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)整理

    在本篇文章里小編給大家整理的是關(guān)于《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)筆記內(nèi)容,需要的朋友們參考下。
    2020-02-02
  • C++ 標(biāo)準(zhǔn)模板類詳解

    C++ 標(biāo)準(zhǔn)模板類詳解

    今天小編就為大家分享一篇關(guān)于C++標(biāo)準(zhǔn)模板類的介紹與使用講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-09-09
  • C語言編程簡(jiǎn)單卻重要的數(shù)據(jù)結(jié)構(gòu)順序表全面講解

    C語言編程簡(jiǎn)單卻重要的數(shù)據(jù)結(jié)構(gòu)順序表全面講解

    這篇文章主要為大家介紹了C語言編程中非常簡(jiǎn)單卻又非常重要的數(shù)據(jù)結(jié)構(gòu)順序表的全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10

最新評(píng)論