1.pthread_join使用范例
2.pthread_join函数应用
3.pthread_joinç使ç¨èä¾
pthread_join使用范例
在Linux中,处理线程结束的方式有两种,一是函数结束,与之相关的线程也随之终止;二是通过pthread_exit直接结束。需要注意的是,一个线程只能被一个线程等待,活动小程序 源码多次调用pthread_join会导致ESRCH错误。默认情况下,线程创建后需要使用pthread_join回收资源,但可通过设置线程属性使其在退出时自动回收。
下面是一个范例,展示了如何使用pthread_join来控制线程行为。在信号测试程序中,子线程被阻塞,等待主程序发送信号。大型cms系统源码主程序通过键盘输入控制子线程,输入'a'打印字符串,输入'q'则发送SIGUSR2信号使线程退出,然后等待线程结束并打印"finish"。
在signaltest.c程序中,我们创建了一个子线程,它会等待主程序发送SIGUSR1或SIGUSR2信号。ip授权验证源码主程序通过scanf获取用户输入,发送相应信号并调用pthread_join来控制子线程的结束。
示例代码如下:
c
#include
#include
//...其他头文件...
void* mythread(void* p) {
//...线程处理代码...
}
int main() {
//...设置信号集和创建子线程...
while (1) {
//...用户输入控制线程行为...
if ('q' == tmp) {
pthread_kill(tid, SIGUSR2); //发送SIGUSR2信号
pthread_join(tid, &status); //等待子线程结束
printf("finish\n"); //主线程结束
break;
}
}
//...程序结束...
}
如果希望创建的线程在退出时自动回收资源,可以设置线程属性为detached。例如:
c
void *start_run(void *arg) {
//...线程工作...
}
int main() {
pthread_t thread_id;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); //设置为detached
pthread_create(&thread_id, &attr, start_run, NULL);
//...主线程结束...
}
线程设置为joinable后,可以使用pthread_detach变为detached,但反之则不能。嘀嘀红人网站源码如果线程已经调用过pthread_join,再调用pthread_detach将无效。
pthread_join函数应用
在Linux环境中,线程的管理涉及到资源回收和线程间协同。默认情况下,一旦创建了线程,就需要使用pthread_join函数来确保资源的windows 源码 泄露 下载正确释放。然而,可以通过设置线程属性(Threads attributes)来改变这种行为,使其在线程结束时自动回收资源。关于这部分的详细信息,可以查阅Threads attributes的文档。
实际上,Linux中线程的创建是通过系统调用clone()来实现的,它创建了一个与原进程几乎完全相同的副本,新线程在其中执行。这个复制过程与fork有所不同,新进程继承了原进程的所有变量和运行环境,因此原进程中的变量变化在新进程中会实时反映出来。pthread_join的作用在于,它使得一个线程能够等待另一个线程的完成,避免主线程过早结束导致其他线程无法执行。
在未使用pthread_join的代码中,主线程往往在新线程创建后迅速结束,导致新线程无法启动。而通过调用pthread_join,主线程会暂停并等待指定线程执行完毕,这样确保了新线程有执行的机会。每个线程都有一个唯一的标识符,称为线程号,其类型为pthread_t,可以通过调用pthread_self()函数获取当前线程的线程号。
pthread_joinç使ç¨èä¾
ä¸ä¸ªçº¿ç¨çç»ææ两ç§éå¾ï¼ä¸ç§æ¯è±¡æ们ä¸é¢çä¾åä¸æ ·ï¼å½æ°ç»æäºï¼è°ç¨å®ç线ç¨ä¹å°±ç»æäºï¼å¦ä¸ç§æ¹å¼æ¯éè¿å½æ°pthread_exitæ¥å®ç°ãå¦å¤éè¦è¯´æçæ¯ï¼ä¸ä¸ªçº¿ç¨ä¸è½è¢«å¤ä¸ªçº¿ç¨çå¾ ï¼ä¹å°±æ¯è¯´å¯¹ä¸ä¸ªçº¿ç¨åªè½è°ç¨ä¸æ¬¡pthread_joinï¼å¦ååªæä¸ä¸ªè½æ£ç¡®è¿åï¼å ¶ä»çå°è¿åESRCH é误ãå¨Linuxä¸ï¼é»è®¤æ åµä¸æ¯å¨ä¸ä¸ªçº¿ç¨è¢«å建åï¼å¿ 须使ç¨æ¤å½æ°å¯¹å建ç线ç¨è¿è¡èµæºåæ¶ï¼ä½æ¯å¯ä»¥è®¾ç½®Threads attributesæ¥è®¾ç½®å½ä¸ä¸ªçº¿ç¨ç»ææ¶ï¼ç´æ¥åæ¶æ¤çº¿ç¨æå ç¨çç³»ç»èµæºï¼è¯¦ç»èµææ¥çThreads attributesã
èä¾ï¼
//signaltest.cãã// å线ç¨é»å¡ï¼çå¾ ä¿¡å·ï¼ç¶åè¾åºå符串ãã// 主线ç¨ä»é®çå½å ¥å符ï¼ç»å线ç¨åä¿¡å·ã #include<stdio.h>#include<unistd.h>#include<signal.h>#include<pthread.h>#include<time.h>pthread_ttid;ãsigset_tset;voidmyfunc(){ ãprintf(hello\n);}staticvoid*mythread(void*p){ ãintsignum;ãwhile(1){ ãsigwait(&set,&signum);ãif(SIGUSR1==signum)ãmyfunc();ãif(SIGUSR2==signum)ã{ ãprintf(Iwillsleep2secondandexit\n);ãsleep(2);ãbreak;ã}}}intmain(){ chartmp;void*status;sigemptyset(&set);sigaddset(&set,SIGUSR1);sigaddset(&set,SIGUSR2);sigprocmask(SIG_SETMASK,&set,NULL);pthread_create(&tid,NULL,mythread,NULL);while(1){ printf(:);scanf(%c,&tmp);if('a'==tmp){ pthread_kill(tid,SIGUSR1);//åéSIGUSR1ï¼æå°å符串ã}elseif('q'==tmp){ //ååºSIGUSR2ä¿¡å·ï¼è®©çº¿ç¨éåºï¼å¦æåéSIGKILLï¼çº¿ç¨å°ç´æ¥éåºãpthread_kill(tid,SIGUSR2);//çå¾ çº¿ç¨tidæ§è¡å®æ¯ï¼è¿éé»å¡ãpthread_join(tid,&status);printf(finish\n);break;}elsecontinue;}return0;}è¿è¡ç»æï¼
// å¦æè¾å ¥aï¼å线ç¨æå°helloï¼ä¸»ç¨åºç»§ç»çå¾ è¾å ¥ï¼
// å¦æè¾å ¥qï¼ä¸»ç¨åºçå¾ åç¨åºç»æãå线ç¨æå°I will sleep 2 second and exitï¼å¹¶å»¶æ¶ä¸¤ç§åç»æã主线ç¨éä¹æå°finishï¼ç¨åºç»æã
å¨åé¢æ们æå°ï¼å¯ä»¥éè¿pthread_join()å½æ°æ¥ä½¿ä¸»çº¿ç¨é»å¡çå¾ å ¶ä»çº¿ç¨éåºï¼è¿æ ·ä¸»çº¿ç¨å¯ä»¥æ¸ çå ¶ä»çº¿ç¨çç¯å¢ãä½æ¯è¿æä¸äºçº¿ç¨ï¼æ´å欢èªå·±æ¥æ¸ çéåºçç¶æï¼ä»ä»¬ä¹ä¸æ¿æ主线ç¨è°ç¨pthread_joinæ¥çå¾ ä»ä»¬ãæ们å°è¿ä¸ç±»çº¿ç¨çå±æ§ç§°ä¸ºdetachedãå¦ææ们å¨è°ç¨pthread_create()å½æ°çæ¶åå°å±æ§è®¾ç½®ä¸ºNULLï¼å表ææ们å¸ææå建ç线ç¨éç¨é»è®¤çå±æ§ï¼ä¹å°±æ¯joinableãå¦æéè¦å°å±æ§è®¾ç½®ä¸ºdetachedï¼ååèä¸é¢çä¾åï¼ void*start_run(void*arg){ //dosomework}intmain(){ pthread_tthread_id;pthread_attr_tattr;pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);pthread_create(&thread_id,&attr,start_run,NULL);pthread_attr_destroy(&attr);sleep(5);exit(0);}å¨çº¿ç¨è®¾ç½®ä¸ºjoinableåï¼å¯ä»¥è°ç¨pthread_detach()使ä¹æ为detachedãä½æ¯ç¸åçæä½åä¸å¯ä»¥ãè¿ããæï¼å¦æ线ç¨å·²ç»è°ç¨pthread_join()åï¼ååè°ç¨pthread_detach()åä¸ä¼æä»»ä½ææã