皮皮网

【linprog的源码】【python笔记源码】【vue服装源码】pthreadjoin源码

2024-11-19 16:21:35 来源:蛟龙10源码

1.pthread_join的使用范例
2.os.path.join函数用法是什么?
3.pthread_join函数应用
4.pthread_join使用范例

pthreadjoin源码

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()则不会有任何效果。

os.path.join函数用法是什么?

       结论:os.path.join函数是一个用于拼接路径的工具,它在操作系统路径处理中发挥重要作用,根据系统自动识别并使用合适的路径分隔符,如"/"或 "\"。让我们通过实例来直观了解其用法。

       当需要在代码中组合多个路径部分时,linprog的源码例如:

       os.path.join("home", "me", "mywork")

       这个函数会根据操作系统环境自动调整路径分隔符。在Linux系统中,它会返回:

       "home/me/mywork"

       而在Windows系统中,它会生成:

       "home\me\mywork"

       这样就确保了跨平台的路径兼容性。

       然而,这个函数与`pthread_join`是两个完全不同的概念。`pthread_join`用于线程同步,它阻塞主线程直到指定线程完成。函数原型如下:

       pthread_join(thread: 线程标识符, retval: 用户定义的指针)

       它用于等待线程结束,并且要求被等待的线程是可join的。当线程已经结束,函数会立即返回,返回0表示成功,python笔记源码非0值代表错误。

       请确保在使用`os.path.join`时处理路径,而在处理线程同步时使用`pthread_join`。这两个函数在各自的领域内提供了不同的功能。

pthread_join函数应用

       在Linux环境中,线程的管理涉及到资源回收和线程间协同。默认情况下,一旦创建了线程,就需要使用pthread_join函数来确保资源的vue服装源码正确释放。然而,可以通过设置线程属性(Threads attributes)来改变这种行为,使其在线程结束时自动回收资源。关于这部分的详细信息,可以查阅Threads attributes的文档。

       实际上,Linux中线程的创建是通过系统调用clone()来实现的,它创建了一个与原进程几乎完全相同的副本,新线程在其中执行。手机源码引流这个复制过程与fork有所不同,新进程继承了原进程的所有变量和运行环境,因此原进程中的变量变化在新进程中会实时反映出来。pthread_join的作用在于,它使得一个线程能够等待另一个线程的完成,避免主线程过早结束导致其他线程无法执行。

       在未使用pthread_join的代码中,主线程往往在新线程创建后迅速结束,导致新线程无法启动。rebase丢失源码而通过调用pthread_join,主线程会暂停并等待指定线程执行完毕,这样确保了新线程有执行的机会。每个线程都有一个唯一的标识符,称为线程号,其类型为pthread_t,可以通过调用pthread_self()函数获取当前线程的线程号。

pthread_join使用范例

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

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

       在signaltest.c程序中,我们创建了一个子线程,它会等待主程序发送SIGUSR1或SIGUSR2信号。主程序通过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将无效。