皮皮网

皮皮网

【上海微信商城系统源码下载】【vwmacd指标源码】【fgo紫宫源码】pthread join源码

时间:2024-11-30 03:52:08 分类:休闲

1.pthread_join使用范例
2.pthread_join函数应用
3.pthread_join的使用范例

pthread join源码

pthread_join使用范例

       在Linux中,处理线程结束的方式有两种,一是函数结束,与之相关的线程也随之终止;二是通过pthread_exit直接结束。需要注意的是,一个线程只能被一个线程等待,上海微信商城系统源码下载多次调用pthread_join会导致ESRCH错误。默认情况下,线程创建后需要使用pthread_join回收资源,但可通过设置线程属性使其在退出时自动回收。

       下面是一个范例,展示了如何使用pthread_join来控制线程行为。在信号测试程序中,子线程被阻塞,等待主程序发送信号。vwmacd指标源码主程序通过键盘输入控制子线程,输入'a'打印字符串,输入'q'则发送SIGUSR2信号使线程退出,然后等待线程结束并打印"finish"。

       在signaltest.c程序中,我们创建了一个子线程,它会等待主程序发送SIGUSR1或SIGUSR2信号。fgo紫宫源码主程序通过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,但反之则不能。cubase机架源码如果线程已经调用过pthread_join,再调用pthread_detach将无效。

pthread_join函数应用

       在Linux环境中,线程的管理涉及到资源回收和线程间协同。默认情况下,一旦创建了线程,就需要使用pthread_join函数来确保资源的企业首页 源码正确释放。然而,可以通过设置线程属性(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()则不会有任何效果。