arg是什么函数_怎么实现边听歌边搜图?线程初体验:常用函数
生活随笔
收集整理的這篇文章主要介紹了
arg是什么函数_怎么实现边听歌边搜图?线程初体验:常用函数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
圖控大叔
構(gòu)圖傳遞思想
閱讀從未如此簡(jiǎn)單!!!
01
前言
? ? ? ?今天我們來(lái)認(rèn)識(shí)一下線(xiàn)程及其常用函數(shù)。當(dāng)你今天看到我在寫(xiě)推文時(shí),你可能會(huì)說(shuō):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???02
目錄總覽
2-1 什么是線(xiàn)程2-2?常用函數(shù)速覽2-3?各函數(shù)參數(shù)說(shuō)明
2-4?例程分享
2-1
什么是線(xiàn)程
1,稱(chēng)之為調(diào)度的最小單位,CPU的任務(wù)調(diào)度都是以線(xiàn)程為單位去調(diào)度的2,所有的進(jìn)程里面都有至少一條線(xiàn)程
3,如果是同個(gè)進(jìn)程的線(xiàn)程,共享所有資源
4,任務(wù)隊(duì)列的依賴(lài)原型
5,每個(gè)線(xiàn)程獨(dú)立擁有一片棧空間,默認(rèn)大小為2-8M也就是說(shuō),
1、線(xiàn)程創(chuàng)建后會(huì)很認(rèn)真的去一件事
2、多個(gè)線(xiàn)程同時(shí)運(yùn)行其實(shí)是切割系統(tǒng)時(shí)間片
?宏觀并行,微觀串行
3、這就是標(biāo)題提到的:邊聽(tīng)歌邊搜圖的實(shí)現(xiàn)基礎(chǔ)
2-2
常用函數(shù)速覽
int?pthread_create(pthread_t *thread, const?pthread_attr_t *attr,void?*(*start_routine) (void?*), void?*arg);????線(xiàn)程創(chuàng)建int?pthread_cancel(pthread_t thread);
????發(fā)指令請(qǐng)求結(jié)束指定線(xiàn)程
????(包含取消點(diǎn)函數(shù)知識(shí)點(diǎn))void?pthread_exit(void?*retval);
????線(xiàn)程結(jié)束自身int?pthread_join(pthread_t thread, void?**retval);
????指定線(xiàn)程ID,回收線(xiàn)程資源pthread_t pthread_self(void);
????線(xiàn)程獲取自身線(xiàn)程IDvoid?pthread_cleanup_push(void?(*routine)(void?*),void?*arg);
??????注冊(cè)函數(shù)功能:線(xiàn)程收到取消指令后,
??????會(huì)先執(zhí)行已經(jīng)注冊(cè)的函數(shù),再退出線(xiàn)程void?pthread_cleanup_pop(int?execute);
??????清除注冊(cè)過(guò)的函數(shù),線(xiàn)程收到取消指令后,直接退出
2-3
各函數(shù)參數(shù)說(shuō)明
pthread_create函數(shù)功能:??????在進(jìn)程當(dāng)中創(chuàng)建出一條線(xiàn)程
????參數(shù):
????? thread:如果進(jìn)程創(chuàng)建成功,將會(huì)往這個(gè)內(nèi)存里面填充一個(gè)線(xiàn)程的ID
????? attr:線(xiàn)程的屬性變量,創(chuàng)建線(xiàn)程的時(shí)候會(huì)依賴(lài)于這個(gè)線(xiàn)程的屬性變量去創(chuàng)建出一個(gè)線(xiàn)程,這個(gè)參數(shù)如果需要使用,需要調(diào)用pthread_attr_init函數(shù)初始化它。如果這個(gè)參數(shù)為NULL,則代表按照默認(rèn)屬性創(chuàng)建。
????????線(xiàn)程的屬性重點(diǎn)包含著:1,線(xiàn)程的分離屬性2,線(xiàn)程的棧空間大小3,線(xiàn)程的優(yōu)先級(jí)
start_routine:一個(gè)函數(shù)指針類(lèi)型,新的線(xiàn)程將會(huì)去執(zhí)行這個(gè)函數(shù)的內(nèi)容
arg:這個(gè)是傳輸給start_routine這個(gè)函數(shù)的參數(shù)
????返回值:
??????成功則返回0,失敗則返回一個(gè)錯(cuò)誤值,errno沒(méi)有被設(shè)置
示例:pthread_t?tid;int?retval;
retval = pthread_create( &tid, NULL, new_thread, "hello thread");
new_thread:函數(shù)名pthread_cancel函數(shù)功能:
????????給指定的線(xiàn)程發(fā)送一個(gè)取消指令,該線(xiàn)程默認(rèn)收到此取消指令后回退出線(xiàn)程(線(xiàn)程運(yùn)行到取消點(diǎn)函數(shù)的時(shí)候,哪些是取消點(diǎn)函數(shù)可以參照man 7 pthreads)
??????參數(shù):
????????? thread:指定的線(xiàn)程ID
??????返回值:
????????成功返回0,失敗返回一個(gè)錯(cuò)誤的數(shù)字,errno不會(huì)被設(shè)置pthread_exit函數(shù)功能:
????????結(jié)束自身,即退出一個(gè)線(xiàn)程,如果所有的線(xiàn)程都退出了,我們就會(huì)結(jié)束進(jìn)程
????參數(shù):
??????? retval:會(huì)將線(xiàn)程退出時(shí)可以返回給等待這個(gè)線(xiàn)程退出的函數(shù)(pthread_join)返回值:pthread_join函數(shù)功能:
????????等待指定的線(xiàn)程退出,并且接收其返回值。
????參數(shù):
??????? thread:指定等待退出的線(xiàn)程的ID
??????? retval:用來(lái)接收線(xiàn)程退出的返回值的void?*的變量的地址,如果不想接收可以直接填入NULL
????返回值:
????????成功返回0,失敗返回一個(gè)錯(cuò)誤的值,errno不會(huì)被設(shè)置pthread_self函數(shù)功能:獲取本線(xiàn)程ID:
無(wú)參數(shù)
返回值:成功返回該線(xiàn)程的ID值pthread_cleanup_push函數(shù)功能:
取消指令退出線(xiàn)程前的注冊(cè)函數(shù),用于執(zhí)行該函數(shù)過(guò)后,
如果接收到線(xiàn)程的取消指令,則先去執(zhí)行該函數(shù)所注冊(cè)的函數(shù)后,才能退出線(xiàn)程
參數(shù):
????? routine:如果接收到取消指令,則去執(zhí)行這個(gè)函數(shù)指針?biāo)淼暮瘮?shù)的內(nèi)容
????? arg:這個(gè)是傳輸給routine這個(gè)函數(shù)指針的函數(shù)的參數(shù)
示例:void?routine(void?*arg){printf("嘻嘻 arg=%s\n", (char?*)arg);
}
{//線(xiàn)程中
??pthread_cleanup_push(routine, "哈哈");
}pthread_cleanup_pop函數(shù)功能:
必須與上面的函數(shù)配套使用,用于清除出注冊(cè)的函數(shù),代表以后接收到取消指令我們也不會(huì)去執(zhí)行注冊(cè)的函數(shù)
參數(shù):execute:
如果該值為0,則清除出注冊(cè)函數(shù),而不去執(zhí)行注冊(cè)函數(shù)的內(nèi)容,
如果該值為非0,則清除出注冊(cè)函數(shù)的同時(shí),去運(yùn)行注冊(cè)函數(shù)的內(nèi)容
2-4
例程分享
線(xiàn)程結(jié)束自身#include?#include?
#include?
#include?
#include?
#include?
void?*new_thread(void?*arg){
??char?*string?= arg;
??int?i;
??for(i=0; i<3; i++)
??{
????printf("arg=%s\n", string);
????sleep(1);
??}
??pthread_exit("exit");//退出一個(gè)線(xiàn)程
??
??//return "exit";
}
?
int?main(void){
??int?retval;
??void?*retpoint;
??pthread_t?tid;
?
??//創(chuàng)建一條線(xiàn)程
??retval = pthread_create( &tid, NULL, new_thread, "hello thread");
??if(retval != 0)
??{
????//perror("創(chuàng)建線(xiàn)程失敗:");
????fprintf(stderr, "創(chuàng)建線(xiàn)程失敗:%s\n", strerror(retval));
????return?-1;
??}
?
??pthread_join(tid, &retpoint);//等待回收指定的線(xiàn)程, 若tid指定的線(xiàn)程不退出,則主線(xiàn)程則阻塞在此
??
??printf("接合成功 返回值為%s\n", (char?*)retpoint);
??
??return?0;
}線(xiàn)程退出前的執(zhí)行函數(shù)實(shí)驗(yàn)#include?#include?#include?#include?#include?#include?pthread_t?tid;void?routine(void?*arg){printf("嘻嘻 arg=%s\n", (char?*)arg);
}void?*thread(void?*arg){int?i, j, z=5;//設(shè)置線(xiàn)程一旦有人對(duì)線(xiàn)程發(fā)送取消請(qǐng)求則馬上退出線(xiàn)程,不用遇到取消點(diǎn)函數(shù)
??pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);??//在線(xiàn)程被取消的時(shí)候,要求在退出線(xiàn)程之前執(zhí)行routine里面的內(nèi)容,//"哈哈"則是傳輸給routine的參數(shù)
??pthread_cleanup_push(routine, "哈哈");while(z--)
??{for( i=80000; i>0; i--)for( j=8000; j>0; j--);printf("in thread\n");
??}??//將pthread_cleanup_push所聲明如果取消線(xiàn)程時(shí)執(zhí)行的routine函數(shù)清除出去,//0代表清除而不執(zhí)行,//非0代表清除且執(zhí)行一下pthread_cleanup_push所注冊(cè)的routine函數(shù)里面的內(nèi)容??pthread_cleanup_pop(0);
??z=5;while(z--)
??{for( i=80000; i>0; i--)for( j=8000; j>0; j--);printf("next thread\n");
??}return???NULL;
}void?sighand(int?signum){??//給指定線(xiàn)程發(fā)送取消請(qǐng)求,線(xiàn)程遇到取消點(diǎn)函數(shù)才會(huì)退出
??pthread_cancel(tid);
}int?main(void){int?retval;??/*
??信號(hào)注冊(cè)
? SIGINT:Ctrl + c
??sighand: 按下Ctrl + c 時(shí)會(huì)去執(zhí)行的函數(shù)
??*/
??signal(SIGINT, sighand);
??pthread_create(&tid, NULL, thread, NULL);??//等待線(xiàn)程結(jié)束,回收資源
??retval = pthread_join(tid, NULL);if(retval != 0)
??{fprintf(stderr, "join failed :%s\n", strerror(retval));return?-1;
??}printf("join success\n");return?0;
}
03
結(jié)尾
? ? ? ?內(nèi)容分享,就先到這里了!
總結(jié)
以上是生活随笔為你收集整理的arg是什么函数_怎么实现边听歌边搜图?线程初体验:常用函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python open 相对路径_第十四
- 下一篇: switch语句可以被代替吗_大空间建筑